簡體   English   中英

反序列化 JSON 對象與數組

[英]Deserialization JSON object vs. array

我從 REST-API 得到以下 JSON 消息作為返回:

{
   "result":{
      "CONTACT":[
         102565, 
         523652
      ],
      "COMPANY":[
         30302
      ]
   }
}

對於反序列化,我將 Newtonsoft.Json 與以下類一起使用:

public class DuplicateResponseBody {
    [JsonProperty("result")]
    public ContactCompany Result { get; set; }
}

public class ContactCompany {
    [JsonProperty("CONTACT")]
    public int[] ContactIds { get; set; }
    [JsonProperty("COMPANY")]
    public int[] CompanyIds { get; set; }
}

這工作沒有問題。

但是當沒有值時,REST-Response 看起來像

{
   "result":[]
}

結果不是數組,反序列化將不再起作用。 我無法更改 REST-API。

有人有想法,我該如何解決反序列化步驟的問題?

我認為您不需要任何轉換器,只需將 json 構造函數添加到您的類就足夠了

public class DuplicateResponseBody
{
    [JsonProperty("result")]
    public ContactCompany Result { get; set; }
    
    [Newtonsoft.Json.JsonConstructor]
    public  DuplicateResponseBody(JToken result)
    {
         if ( result.Type.ToString()!="Array")
         Result= result.ToObject<ContactCompany>();
    }

    public DuplicateResponseBody() {}
}

您可以為該屬性實現自定義JsonConverter並將數組視為null

public class ContactCompanyConverter : JsonConverter<ContactCompany>
{
    public override ContactCompany ReadJson(
        JsonReader reader,
        Type objectType,
        ContactCompany existingValue,
        bool hasExistingValue,
        JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        return token.Type != JTokenType.Array ? token.ToObject<ContactCompany>() : null;
    }

    public override void WriteJson(
        JsonWriter writer,
        ContactCompany value,
        JsonSerializer serializer)
    {
        var token = JToken.FromObject(value);
        token.WriteTo(writer);
    }
}

為了使用轉換器,只需通過您的屬性上的JsonConverterAttribute傳遞它。

public class DuplicateResponseBody
{
    [JsonProperty("result")]
    [JsonConverter(typeof(ContactCompanyConverter))]
    public ContactCompany Result { get; set; }
}

暫無
暫無

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

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