混合 JSON 数组和对象的 C# 反序列化
本文解决了从 Facebook 等来源反序列化 JSON 数据的挑战,其中数据结构可能不一致地显示为数组或对象。 标准 JSON.NET 反序列化在这种情况下通常会失败。
解决方案:自定义 JsonConverter
解决方案涉及创建自定义 JSON.NET 转换器。 该转换器可以处理数组和对象格式,确保反序列化的一致性。 (有关更详细的说明,请参阅“使用自定义 JsonConverter 修复错误的 JSON 结果”。)
实现自定义转换器
该解决方案的核心是一个自定义转换器,即使输入 JSON 是单个对象,它也会返回目标类型的列表。
属性属性:
C# 类中保存反序列化数据的属性需要使用自定义转换器进行注释:
<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))] public List<OrderItem> Items;</code>
SingleValueArrayConverter
班级:
此自定义转换器检查 JSON 令牌类型并适当反序列化:
<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); // Not implemented for this example } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartObject) { T instance = (T)serializer.Deserialize(reader, typeof(T)); return new List<T> { instance }; } else if (reader.TokenType == JsonToken.StartArray) { return serializer.Deserialize(reader, objectType); } return null; // Handle other token types as needed } public override bool CanConvert(Type objectType) { return true; // Or add specific type checking here for robustness } }</code>
此转换器确保无论 JSON 输入是单个对象还是数组,生成的 C# 属性都将始终包含 List<T>
。 请注意,可能需要添加错误处理(例如,针对意外的令牌类型)以供生产使用。 当列表是适合单对象和数组 JSON 输入的数据结构时,此方法特别有用。 对于列表不合适的情况,可能需要替代解决方案。
以上是如何使用自定义 JsonConverter 在 C# 中反序列化混合 JSON 数组和对象?的详细内容。更多信息请关注PHP中文网其他相关文章!