如何格式化Json而序列化?



我使用Newtonsoft.Json进行JSon序列化和反序列化。我有问题与缩进的对象元素列表。我的问题是我想在一行中显示10个元素,然后再显示10个元素,其余的将在第三行。用JToken怎么可能呢?

下面是我的期望输出。

"parameters": [
{           
"description": "EnableTestValues",
"defaults": [
0,1,1,2,3,4,5,6,9,7,
99,12,85,14,66,78
],
"size": [
1,16
]
},
{            
"description": "CEC_Emer_Stop_Val",
"defaults": [
false
],
"size": [
1,1
]
},
{            
"description": "CEC_Emer_Stop_Sw",
"defaults": [
252
],
"size": [
1,1
]
}          
]

但是我得到

"parameters": [
{           
"description": "EnableTestValues",
"defaults": [
0,
1,
1,
2,
3,
4,
5,
6,
9,
7,
99,
12,
85,
14,
66,
78
],
"size": [
1,
16
]
},
{            
"description": "CEC_Emer_Stop_Val",
"defaults": [
false
],
"size": [
1,
1
]
},
{            
"description": "CEC_Emer_Stop_Sw",
"defaults": [
252
],
"size": [
1,
1
]
}          
]

default和size属性的问题

序列化和反序列化我使用动态对象。代码如下:

dynamic mdcsJson;
using (StreamReader r = new StreamReader(mdcsJsonFilePath))
{
string fileContent = System.IO.File.ReadAllText(mdcsJsonFilePath, Encoding.GetEncoding(1250));
mdcsJson = JsonConvert.DeserializeObject(fileContent);
}
// Updating some values here
string strJson = JsonConvert.SerializeObject(mdcsJson)

使用自定义JsonConverter

public class FormatArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsArray;
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
var values = (value as Array).OfType<object>().ToArray();
writer.WriteStartArray();
writer.WriteRawValue(""); // makes a line break
if (values.All(x => x.GetType().IsPrimitive))
{
foreach (var chunk in values.Chunk(10))
{
writer.WriteRaw(string.Join(",", chunk));
if (chunk.Length == 10)
writer.WriteRawValue(""); // makes a line break
}
}
else
{
foreach (var item in values)
serializer.Serialize(writer, item);
}
writer.WriteEndArray();
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

模型:

public class Root
{
public Parameter[] parameters { get; set; }
}
public class Parameter
{
public string description { get; set; }
public object[] defaults { get; set; }
public int[] size { get; set; }
}

数据:

var root = new Root
{
parameters = new Parameter[]
{
new Parameter
{
description = "EnableTestValues",
defaults = new object[] { 0,1,1,2,3,4,5,6,9,7,99,12,85,14,66,78 },
size = new int[] { 1,16 }
},
new Parameter
{
description = "CEC_Emer_Stop_Val",
defaults = new object[] { false },
size = new int[] { 1,1 }
},
new Parameter
{
description = "CEC_Emer_Stop_Sw",
defaults = new object[] { 252 },
size = new int[] { 1,1 }
},
}
};

使用:

var converter = new FormatArrayConverter();
string json = JsonConvert.SerializeObject(root, Formatting.Indented, converter);
Console.WriteLine(json);

最新更新