aspnetcore/src/Microsoft.AspNet.Mvc.Core/JsonOutputFormatter.cs

66 lines
2.1 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
using Newtonsoft.Json;
namespace Microsoft.AspNet.Mvc
{
public class JsonOutputFormatter
{
private readonly JsonSerializerSettings _settings;
private readonly bool _indent;
public JsonOutputFormatter([NotNull] JsonSerializerSettings settings, bool indent)
{
_settings = settings;
_indent = indent;
}
public static JsonSerializerSettings CreateDefaultSettings()
{
return new JsonSerializerSettings()
{
MissingMemberHandling = MissingMemberHandling.Ignore,
// Do not change this setting
// Setting this to None prevents Json.NET from loading malicious, unsafe, or security-sensitive types.
TypeNameHandling = TypeNameHandling.None
};
}
public void WriteObject([NotNull] TextWriter writer, object value)
{
using (var jsonWriter = CreateJsonWriter(writer))
{
var jsonSerializer = CreateJsonSerializer();
jsonSerializer.Serialize(jsonWriter, value);
// We're explicitly calling flush here to simplify the debugging experience because the
// underlying TextWriter might be long-lived. If this method ends up being called repeatedly
// for a request, we should revisit.
jsonWriter.Flush();
}
}
private JsonWriter CreateJsonWriter([NotNull] TextWriter writer)
{
var jsonWriter = new JsonTextWriter(writer);
if (_indent)
{
jsonWriter.Formatting = Formatting.Indented;
}
jsonWriter.CloseOutput = false;
return jsonWriter;
}
private JsonSerializer CreateJsonSerializer()
{
var jsonSerializer = JsonSerializer.Create(_settings);
return jsonSerializer;
}
}
}