簡體   English   中英

如何反序列化包含對象或對象數組的JSON對象

[英]How to deserialize a JSON object containing an object or object array

我正在嘗試反序列化從ARIN whois REST API返回的JSON響應。 我是JSON的新手,但我認為它們會根據結果返回兩種不同的模式,我很難將其拆開。

如果存在多個網絡對象,這是返回的JSON的簡化版本:

{
  "nets": {
    "@xmlns":{"ns3":"http:\/\/www.arin.net\/whoisrws\/netref\/v2",
    "net": [{
        "customerRef": {
          "@name": "Internet Customer",
        },
      }, {
        "orgRef": {
          "@name": "Internet Service Provider",
        },
      }
    ]
  }
}

請注意, netsnet對象的數組。 當僅返回一個網絡對象時,JSON如下所示:

{
  "nets": {
    "@xmlns":{"ns3":"http:\/\/www.arin.net\/whoisrws\/netref\/v2",
    "net": {
        "orgRef": {
          "@name": "Internet Customer",
        },
      }
  }
}

在這種情況下, nets是包含單個net對象的對象。 我可以使用數組或單個嵌入式對象定義我的類,但是使用JsonConvert.DeserializeObject<ARINWhois>(response)反序列化將在與我的模式不一致的結果上引發異常。

我考慮了兩種選擇:

  1. 使用JsonTextReader手動反序列化所有JsonTextReader
  2. 定義兩個對象架構,並在引發異常時重試另一個。

有沒有更簡單,更優雅的解決方案?

感謝Eser22,他為我指出了JsonConverter的使用,該功能正是我所需要的。 如何處理具有相同屬性的單個項目和數組都是一個很好的解釋。 完美的作品!

這是我的代碼的最終版本。

/*
 * parse the response
 */
ARINWhois WhoisResp = JsonConvert.DeserializeObject<ARINWhois>(response);

/*
 *  custom converter
 */
class SingleOrArrayConverter<T> : JsonConverter
{
  public override bool CanConvert(Type objectType)
  {
    return (objectType == typeof(List<T>));
  }

  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
    JToken token = JToken.Load(reader);
    if (token.Type == JTokenType.Array)
    {
      return token.ToObject<List<T>>();
    }
    return new List<T> { token.ToObject<T>() };
  }

  public override bool CanWrite
  {
    get { return false; }
  }

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

/*
 * data models
 */
public class ARINWhois
{
  [JsonProperty("nets")]
  public ARINNets Network { get; set; }
}
public class ARINNets
{
  [JsonProperty("net")]
  [JsonConverter(typeof(SingleOrArrayConverter<ARINNet>))]
  public List<ARINNet> Networks;
}

public class ARINNet
{
  [JsonProperty("registrationDate")]
  public ARINregistrationDate RegistrationDate;
  [JsonProperty("orgRef")]
  public ARINorgRef Organization;
  [JsonProperty("customerRef")]
  public ARINcustomerRef Customer;
}
public class ARINregistrationDate
{
  [JsonProperty("$")]
  public string date { get; set; } 
}
public class ARINorgRef
{
  [JsonProperty("@name")]
  public string name { get; set; }
  [JsonProperty("@handle")]
  public string handle { get; set; }
}
public class ARINcustomerRef
{
  [JsonProperty("@name")]
  public string name { get; set; }
  [JsonProperty("@handle")]
  public string handle { get; set; }
}

暫無
暫無

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

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