如何将嵌套JSON数组反序列化为自定义类?(附示例代码)
嵌套数组反序列化解决方案
核心结论
不需要为TableRow单独编写转换器,只需完成TableJsonConverter的实现即可。因为TableRow的Elements属性已经通过[JsonProperty(ItemConverterType = typeof(ElementJsonConverter))]指定了元素转换器,Newtonsoft.Json会自动复用已有的ElementJsonConverter处理内层ElementData对象。
完整实现代码
修正后的Test2方法
先修正Test2中的两处错误:反序列化目标类型应为Message2,且JSON字符串缺少闭合括号:
void Test2() { var msg2 = "{\"type\":\"message2\",\"data\":[[{\"type\":\"element1\",\"name\":\"myname\",\"amount\":0}]]}"; var obj = JsonConvert.DeserializeObject<Message2>(msg2); }
完成TableJsonConverter实现
public class TableJsonConverter : JsonConverter<Table> { public override Table ReadJson(JsonReader reader, Type objectType, Table existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) { // 读取JSON中的二维数组 var jArray = JArray.Load(reader); var table = new Table(); table.Steps = new List<TableRow>(); // 遍历外层数组的每个元素,转换成TableRow对象 foreach (var innerArray in jArray) { var row = new TableRow(); // 利用传入的序列化器反序列化内层数组,自动应用ElementJsonConverter row.Elements = serializer.Deserialize<List<ElementData>>(innerArray.CreateReader()); table.Steps.Add(row); } return table; } public override void WriteJson(JsonWriter writer, Table value, Newtonsoft.Json.JsonSerializer serializer) { // 如需序列化,反向将Table转换为二维数组格式 var jArray = new JArray(); foreach (var row in value.Steps) { var innerArray = JArray.FromObject(row.Elements, serializer); jArray.Add(innerArray); } jArray.WriteTo(writer); } }
原理说明
TableJsonConverter负责将JSON中的二维数组[[...]]映射为Table对象的Steps集合:外层数组的每个元素对应一个TableRow,内层数组直接通过序列化器反序列化为TableRow.Elements。- 由于
TableRow.Elements已经标记了ItemConverterType = typeof(ElementJsonConverter),序列化器在反序列化内层数组时,会自动调用ElementJsonConverter处理每个ElementData子类对象,无需额外编写转换器。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

