问题描述
我想以人类可读的方式将 .NET 对象序列化为 JSON,但我想对对象的属性或数组的元素是否以它们自己的一行结束有更多的控制.
I want to serialize .NET objects to JSON in a human-readable way, but I would like to have more control about whether an object's properties or array's elements end up on a line of their own.
目前我正在使用 JSON.NET 的 JsonConvert.SerializeObject(object, Formatting, JsonSerializerSettings)
方法进行序列化,但似乎我只能应用 Formatting.Indented
(单个行上的所有元素)或 Formatting.None
(一行中的所有内容,没有任何空格)整个对象的全局格式规则.有没有办法在默认情况下全局使用缩进,但为某些类或属性关闭它,例如使用属性或其他参数?
Currently I'm using JSON.NET's JsonConvert.SerializeObject(object, Formatting, JsonSerializerSettings)
method for serialization, but it seems I can only apply the Formatting.Indented
(all elements on individual lines) or Formatting.None
(everything on a single line without any whitespace) formatting rules globally for the entire object. Is there a way to globally use indenting by default, but turn it off for certain classes or properties, e.g. using attributes or other parameters?
为了帮助您理解问题,这里有一些输出示例.使用 Formatting.None
:
To help you understand the problem, here are some output examples. Using Formatting.None
:
{"array":["element 1","element 2","element 3"],"object":{"property1":"value1","property2":"value2"}}
使用Formatting.Indented
:
{
"array": [
"element 1",
"element 2",
"element 3"
],
"object": {
"property1": "value1",
"property2":"value2"
}
}
我想看到的:
{
"array": ["element 1","element 2","element 3"],
"object": {"property1":"value1","property2":"value2"}
}
(我意识到我的问题可能与 这个,但那里的评论完全没有抓住重点,实际上并没有提供有效的答案.)
(I realize my question may be slightly related to this one, but the comments there totally miss the point and don't actually provide a valid answer.)
推荐答案
一种可能性是为您需要特殊处理的特定类型编写自定义 Json 转换器并为它们切换格式:
One possibility would be to write a custom Json converter for the specific types you need special handling and switch the formatting for them:
class Program
{
static void Main()
{
var root = new Root
{
Array = new[] { "element 1", "element 2", "element 3" },
Object = new Obj
{
Property1 = "value1",
Property2 = "value2",
},
};
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
};
settings.Converters.Add(new MyConverter());
string json = JsonConvert.SerializeObject(root, settings);
Console.WriteLine(json);
}
}
public class Root
{
public string[] Array { get; set; }
public Obj Object { get; set; }
}
public class Obj
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
class MyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string[]) || objectType == typeof(Obj);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(JsonConvert.SerializeObject(value, Formatting.None));
}
}
这将输出:
{
"Array": ["element 1","element 2","element 3"],
"Object": {"Property1":"value1","Property2":"value2"}
}
这篇关于如何仅对某些属性应用缩进序列化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!