我正在使用Json.NET,我有以下代码。
public class Row
{
[JsonProperty]
public IDictionary<string, object> Cells { get; set; }
}
行和单元格是动态生成的,我有C#dynamic / Expando功能来创建这些单元格。当Json.NET序列化动态实例时,它会生成我想要的正确json结构。但是,对于大型数据结构,它会对性能产生负面影响。例如,JsonSerializer在序列化期间非常广泛地调用DynamicObject TryGetMember。因此我需要一个静态数据结构,因此序列化会更快。 synamic Expando对象仍然会创建动态属性,但我希望Json.NET序列化使用静态结构(基于动态结构创建),因此序列化会更快。
基于动态结构填充单元格字典,并通过调用JsonConvert,它生成序列化的json结构,如下所示。
string serializeObject = JsonConvert.SerializeObject(data, Formatting.Indented);
// json输出:
{
"Data": [
{
"Cells": {
"column1": "20",
"column2": "20"
}
},
{
"Cells": {
"column1": "20",
"column2": "20"
}
}
]
}
然而,我绑定的UI网格需要以下json结构
"Data": [
{
"column1": "20",
"column2": "20"
},
{
"column1": "20",
"column2": "20"
}
]
有没有办法可以删除“Cells”并生成如上所述的Json结构?
我查看了JSON.NET帮助文档,但我找不到实现此目的的方法。 还尝试重写DynamicContractResolver的CreateProperty方法,看看我是否可以更改序列化行为,但我无法这样做
public class DynamicContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization)
{
if (member.Name == "Cells")
{
//remove the name "Cells" from the serialized structure
}
return base.CreateProperty(member, memberSerialization);
}
}
或者这不是简单的支持?任何建议或方向非常感谢。
答案 0 :(得分:5)
通过创建自定义转换器找到了解决此问题的方法。下面的代码生成了我需要的Json结果。
public class GridJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true; //TODO: more logic check the type before the conversion..
}
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
{
var rows = (List<Row>)value;
writer.WriteStartObject();
writer.WritePropertyName("data");
writer.WriteStartArray();
foreach (var row in rows)
{
writer.WriteStartObject();
var cells = row.Cells;
foreach (var cell in cells)
{
writer.WritePropertyName(cell.Key);
writer.WriteValue(cell.Value);
}
writer.WriteEndObject();
}
writer.Flush();
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
//用法示例:
string serializeObject = JsonConvert.SerializeObject
(someData, Formatting.Indented, new GridJsonConverter());