簡體   English   中英

Deserializing a JSON string to a C# class where JSON class may accept either array / object based on a JSON property

[英]Deserializing a JSON string to a C# class where JSON class may accept either array / object based on a JSON property

我必須將 JSON 字符串反序列化為 C# 類才能綁定到網格。 我已經在 C# 中實現了相應的類。 但在特定情況下,這會失敗,因為 JSON 屬性將是一個數組或 object。 請檢查字符串的一部分。

我創建了 ItemList class 和 3 個屬性 IL1、Name 和另一個 object class “項目”。 但是,您可以看到,當屬性“名稱”為橡膠時,我應該將項目列表 class 作為屬性,而不是項目 object。 當它是橡膠時,它返回 2 個項目的數組。

 "ItemList": [
{
  "@IL1": "Yes",
  "@Name": "Pencil"
  "Item": {
    "@ItemType": "Pencil",
    "@Item2": "1A7716744F7048ACA2549BE93F0A2BF1",        
    "aimLink": {
      "@id": "1A7716744F7048ACA2549BE93F0A2BF1",
      "@DisplayText": "P00001"         
    }
  }
},
{
  "@IL1": "Yes",
  "@Name": "Pen",    
  "Item": {
    "@ItemType": "Pen",
    "@Item2": "AE067F7EDB6147C09AED243C1F7FAD25",        
    "aimLink": {
      "@id": "AE067F7EDB6147C09AED243C1F7FAD25",
      "@DisplayText": "5100010654120001
    }
  }
},
{
  "@IL1": "Yes",
  "@Name": "Rubber",     
  "Item": [
    {
      "@ItemType": "Rubber",
      "@ItemGID": "622025629037499394DF092DA16BAB7F",          
      "aimLink": {
        "@id": "622025629037499394DF092DA16BAB7F",
        "@DisplayText": "12345678-1234-123456-7116#01"
      }
    },
    {
      "@ItemType": "Rubber",
      "@ItemGID": "F336F65F8E014E80B84A2312F829493C"
      "aimLink": {
        "@id": "F336F65F8E014E80B84A2312F829493C",
        "@DisplayText": "12345678-1234-123456-7116#14"
      }
    }
  ]
}
 ],

如何有效地將其解析為 C# class 以及完成此操作的最簡單方法?

謝謝, 迪維亞

您可以通過制作自定義JsonConverter來解決此問題,您可以使用下面將單個值轉換為數組,然后使用JsonConverter屬性標記Item屬性

public class SingleValueArrayConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }



    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object retVal = new Object();
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            retVal = new List<T>() { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            retVal = serializer.Deserialize(reader, objectType);
        }
        return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
        return false;
    }
}

讓我們假設這是您的ItemList class

public class ItemList
{
    public string @IL1 { get; set; }
    public string @Name { get; set; }
    [JsonConverter(typeof(SingleValueArrayConverter<Item>))]
    public List<Item> Item { get; set; }
}

public class Item
{
    public string @ItemType { get; set; }
    public string @Item2 { get; set; }
    public AimLink aimLink { get; set; }
}

public class AimLink
{
    public string @id { get; set; }
    public string @DisplayText { get; set; }
}

您可以制作自定義JsonConverter (例如ItemConverter )並使用[JsonConverter(typeof(ItemConverter))]屬性標記Item屬性

暫無
暫無

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

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