首页 >后端开发 >C++ >如何使用自定义 JsonConverter 在 C# 中反序列化混合 JSON 数组和对象?

如何使用自定义 JsonConverter 在 C# 中反序列化混合 JSON 数组和对象?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-12 19:22:46569浏览

How Can I Deserialize Mixed JSON Arrays and Objects in C# Using a Custom JsonConverter?

混合 JSON 数组和对象的 C# 反序列化

本文解决了从 Facebook 等来源反序列化 JSON 数据的挑战,其中数据结构可能不一致地显示为数组或对象。 标准 JSON.NET 反序列化在这种情况下通常会失败。

解决方案:自定义 JsonConverter

解决方案涉及创建自定义 JSON.NET 转换器。 该转换器可以处理数组和对象格式,确保反序列化的一致性。 (有关更详细的说明,请参阅“使用自定义 JsonConverter 修复错误的 JSON 结果”。)

实现自定义转换器

该解决方案的核心是一个自定义转换器,即使输入 JSON 是单个对象,它也会返回目标类型的列表。

  1. 属性属性:

    C# 类中保存反序列化数据的属性需要使用自定义转换器进行注释:

    <code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
    public List<OrderItem> Items;</code>
  2. 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn