首页 >后端开发 >C++ >如何在反序列化过程中处理不明确的 JSON 数组和对象?

如何在反序列化过程中处理不明确的 JSON 数组和对象?

Barbara Streisand
Barbara Streisand原创
2025-01-12 19:01:43479浏览

How Can I Handle Ambiguous JSON Arrays and Objects During Deserialization?

JSON 反序列化:处理不明确的数组和对象

在处理 JSON 数据时,经常会遇到结构不一致的情况。某些属性在一个实例中可能表示为数组,而在另一个实例中则表示为对象。这在反序列化过程中可能会导致问题,尤其是在使用类型安全类时。

问题:

考虑 Facebook 返回的以下 JSON 数据:

  • 墙面帖子(对象):

    <code class="language-json">  {
        "description": "",
        "permalink": "..."
      }</code>
  • 照片帖子(数组):

    <code class="language-json">  {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }</code>
  • 移动墙面帖子(对象):

    <code class="language-json">  {
        "name": null,
        "caption": null,
        "media": {}
      }</code>

在移动墙面帖子的情况下,“media”属性表示为空对象而不是数组。当使用期望“FacebookMedia”对象数组的类时,这种差异会导致反序列化失败。

解决方案:自定义 JSON 转换器

为了处理这种情况,我们可以创建一个自定义 JSON 转换器。此转换器将检查 JSON 结构,并根据数组或对象的存在返回列表或 null。

<code class="language-csharp">public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize<List<FacebookMedia>>(reader);
        else
            return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<FacebookMedia>);
    }
}</code>

用法:

要使用转换器,请使用 [JsonConverter] 属性注释类中的属性:

<code class="language-csharp">[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> Media { get; set; }</code>

现在,反序列化将成功处理“Media”属性的数组和对象。

针对单个对象的扩展:

如果您希望即使只有一个对象也能收到列表,则可以扩展转换器以将单个对象转换为列表。

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object result;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            result = new List<T> { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}</code>

通过使用自定义 JSON 转换器,我们可以处理 JSON 结构中的不一致性,并确保成功反序列化。

以上是如何在反序列化过程中处理不明确的 JSON 数组和对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

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