"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 사막화 중에 모호한 JSON 어레이 및 객체를 어떻게 처리 할 수 ​​있습니까?

사막화 중에 모호한 JSON 어레이 및 객체를 어떻게 처리 할 수 ​​있습니까?

2025-02-06에 게시되었습니다
검색:187

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

JSON Deserialization : 모호한 배열 및 물체를 처리

JSON 데이터를 처리 할 때는 종종 구조적 불일치가 발생합니다. 일부 속성은 한 인스턴스의 배열로 표시되고 다른 인스턴스의 객체로 표시 될 수 있습니다. 이는 특히 유형-안전 클래스를 사용할 때 사제화 중 문제를 일으킬 수 있습니다.

질문:

Facebook에서 반환 한 다음 JSON 데이터를 고려하십시오 :

  • 벽 게시물 (객체) :

    ]
      {
        "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; }

이제 Dessorialization은 "Media"속성의 배열과 객체를 성공적으로 처리합니다.

단일 개체의 확장자 :

객체가 하나만 있더라도 목록을 수신하려면 변환기를 확장하여 단일 객체를 목록으로 변환 할 수 있습니다.

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;
    }

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

사용자 정의 JSON 변환기를 사용하여 JSON 구조의 불일치를 처리하고 성공적인 사막화를 보장 할 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3