>백엔드 개발 >C++ >역직렬화 중에 모호한 JSON 배열 및 개체를 처리하려면 어떻게 해야 합니까?

역직렬화 중에 모호한 JSON 배열 및 개체를 처리하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-12 19:01:43474검색

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>

이제 역직렬화는 "미디어" 속성의 배열과 개체를 성공적으로 처리합니다.

단일 개체에 대한 확장:

객체가 하나만 있어도 목록을 받고 싶다면 변환기를 확장하여 단일 객체를 목록으로 변환할 수 있습니다.

<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으로 문의하세요.