簡體   English   中英

使用不同的模式反序列化JSON

[英]Deserializing JSON with varying schemas

我將JSON.Net與.NET 4.7一起使用。

在我調用的API中,對於同一個調用,我看似隨機地會得到兩種錯誤json :(。

錯誤類型1:

{
   "Code": 0,
   "Msg": ["Some Warning"]
}

錯誤類型2:

{
    "Code": 0,
    "Msg": [
          {"Error": 5 },
          {"Error": 6 }
    ]
}

如您所見, Msg更改了其結構。 我想要一個通用的POCO進行反序列化,但是Msg何時發生變化?

JsonConvert.DeserializeObject<MyCommonPoco>(theJson);

您可以編寫一個自定義的JsonConverter來處理不同的類型。 例如,您可以具有以下JSON:

{
    "Code": 0,
    "Msg": [
        "A single string",
        { "Message": "An object with a message" },
        { "Message": "An object with a message and a code", "Code": 5 },
        { "Code": 5 }
    ]
}

在此的示例Msg數組可以包含原始字符串或復雜的對象。 該對象可以包含MessageCode或兩者。

您將為此選擇最通用的數據結構,該數據結構能夠表示所有這些信息。 例如,這意味着您將必須將該原始字符串包裝到兼容對象中。

public class Error
{
    public int Code { get; set; }
    public ErrorMessage[] Msg { get; set; }
}

public class ErrorMessage
{
    public string Message { get; set; }
    public int? Code { get; set; }
}

然后,您可以使用自定義

然后,使用自定義JsonConverter ,您可以解析上述JSON:

public class ErrorMessageConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
        => objectType == typeof(ErrorMessage);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // handle the primitive string
        if (reader.TokenType == JsonToken.String)
            return new ErrorMessage { Message = (string)reader.Value };

        // handle a complex object; just assume that it is an `ErrorMessage` here
        else if (reader.TokenType == JsonToken.StartObject)
            return JObject.Load(reader).ToObject<ErrorMessage>();

        throw new NotSupportedException();
    }

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

這將是使用該轉換器的一種方式:

// the single quotes are just here to make it more readable; JSON.NET support this
// although it isn’t valid JSON
var json = @"{
    'Code': 0,
    'Msg': [
        'A single string',
        { 'Message': 'An object with a message' },
        { 'Message': 'An object with a message and a code', 'Code': 5 },
        { 'Code': 5 }
    ]
}";

var settings = new JsonSerializerSettings()
settings.Converters.Add(new ErrorMessageConverter());

var result = JsonConvert.DeserializeObject<Error>(json, settings);

成功解析結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM