「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 脱介入中に曖昧なJSONアレイとオブジェクトを処理するにはどうすればよいですか?

脱介入中に曖昧なJSONアレイとオブジェクトを処理するにはどうすればよいですか?

2025-02-06に投稿しました
ブラウズ:453

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

json deserialization:あいまいな配列とオブジェクトを処理する

JSONデータを処理する場合、しばしば構造的な矛盾に遭遇します。一部のプロパティは、ある例では配列として、別の例ではオブジェクトとして表される場合があります。これは、特にタイプセーフクラスを使用する場合、脱介入中に問題を引き起こす可能性があります。

質問:

Facebookで返された次のJSONデータを検討してください:

  • Wall Posts(object):

    ]
      {
        "description": "",
        "permalink": "..."
      }
  • 写真投稿(配列):

      {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }
  • モバイルウォールポスト(オブジェクト):

      {
        "name": null,
        "caption": null,
        "media": {}
      }

壁のポストを移動する場合、「メディア」属性は配列の代わりに空のオブジェクトとして表されます。この違いにより、「FacebookMedia」オブジェクトの配列を期待するクラスを使用すると、脱気が脱出しなくなります。

ソリューション:カスタムJSONコンバーター

この状況を処理するために、カスタムJSONコンバーターを作成できます。このコンバーターは、JSON構造をチェックし、配列またはオブジェクトの存在に基づいてリストまたはnullを返します。

public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize>(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);
    }
}

使用法:

コンバーターを使用するには、 [jsonconverter] 属性コメントクラスを使用します。

[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List Media { get; set; }

単一オブジェクトの拡張機能:

1つのオブジェクトのみであっても、リストを受信したい場合は、コンバーターを拡張して単一のオブジェクトをリストに変換できます。

Public Class singlevaluearrayconverter :jsonConverter { パブリックオーバーライドオブジェクトreadjson(jsonreader reader、type objectype、object expstingvalue、jsonserializer serializer) { オブジェクトの結果; if(reader.tokentype == jsontoken.startobject) { t instance =(t)serializer.deserialize(reader、typeof(t)); result = new list {instance}; } else if(reader.tokentype == jsontoken.startarray) { result = serializer.deserialize(reader、objectType); } それ以外 { 新しいjsonserializationexception( "予期しないトークンタイプ。"); } 返品結果; } // ...残りのコンバーター実装... }
public class SingleValueArrayConverter : 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 { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3