C#中如何序列化/反序列化混合对象与对象列表的JSON?
处理混合类型数组的Newtonsoft.Json序列化/反序列化方案
针对你遇到的顶层数组同时包含单个对象和对象数组的JSON格式,这里提供两种可行的处理方式:
1. 自定义JsonConverter(推荐,可复用)
首先确保你已经定义了对应的实体类:
public class FieldValue { public string value { get; set; } public string field { get; set; } }
创建一个自定义转换器,自动处理单个对象和数组的混合情况,最终输出扁平化的List<FieldValue>:
public class MixedArrayConverter : JsonConverter<List<FieldValue>> { public override List<FieldValue> ReadJson(JsonReader reader, Type objectType, List<FieldValue> existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = new List<FieldValue>(); if (reader.TokenType != JsonToken.StartArray) return result; while (reader.Read()) { if (reader.TokenType == JsonToken.EndArray) break; // 处理单个对象 if (reader.TokenType == JsonToken.StartObject) { var item = serializer.Deserialize<FieldValue>(reader); result.Add(item); } // 处理嵌套数组 else if (reader.TokenType == JsonToken.StartArray) { var subItems = serializer.Deserialize<List<FieldValue>>(reader); result.AddRange(subItems); } } return result; } public override void WriteJson(JsonWriter writer, List<FieldValue> value, JsonSerializer serializer) { // 若需要序列化回原混合格式,可在此添加分组逻辑,以下默认输出全单个对象的数组 writer.WriteStartArray(); foreach (var item in value) { serializer.Serialize(writer, item); } writer.WriteEndArray(); } }
使用方式:
string jsonStr = "你的目标JSON字符串"; var settings = new JsonSerializerSettings { Converters = { new MixedArrayConverter() } }; List<FieldValue> data = JsonConvert.DeserializeObject<List<FieldValue>>(jsonStr, settings);
2. 直接处理JToken(快速临时方案)
如果不需要复用逻辑,可以直接解析JSON的Token结构,手动处理混合元素:
string jsonStr = "你的目标JSON字符串"; var rawElements = JsonConvert.DeserializeObject<List<object>>(jsonStr); var finalData = new List<FieldValue>(); foreach (var element in rawElements) { if (element is JObject singleObj) { finalData.Add(singleObj.ToObject<FieldValue>()); } else if (element is JArray subArray) { finalData.AddRange(subArray.ToObject<List<FieldValue>>()); } }
两种方式都能完美处理给定的JSON格式,根据你的场景选择即可。
内容的提问来源于stack exchange,提问作者ebelair
相关产品推荐
相关产品推荐

