簡體   English   中英

使用 C# Json.NET 使用動態鍵反序列化 JSON

[英]Deserialize JSON with dynamic keys using C# Json.NET

我從外部 API 收到以下有關客戶銀行詳細信息的 JSON 響應。

{
   "bankDetails":[
      {
         "ABC Bank":[
            {
               "sNo":1,
               "acNo":"1235465",
               "acBalance":"100.25"
            },
            {
               "sNo":2,
               "acNo":"1235467",
               "acBalance":"50.25"
            }
         ],
         "bankName":"ABC Bank",
         "totalAmount":"150.50"
      },
      {
         "XYZ Bank":[
            {
               "sNo":1,
               "acNo":"1248565",
               "acBalance":"75.25"
            }
         ],
         "bankName":"XYZ Bank",
         "totalAmount":"75.25"
      },
      {
         "BCD Bank":[
            {
               "sNo":1,
               "acNo":"145665",
               "acBalance":"10.25"
            },
            {
               "sNo":2,
               "acNo":"195267",
               "acBalance":"5.25"
            }
         ],
         "bankName":"BCD Bank",
         "totalAmount":"15.50"
      }
   ]
}

我需要使用 JSON.Net 將其反序列化為 C# 類。 C# 類的結構應該是什么,因為第一個鍵是動態的? 每個客戶返回的帶有銀行名稱的第一個密鑰將不同

處理動態鍵的典型解決方案是使用Dictionary<string, T>代替常規類。 請參閱如何使用動態(數字)鍵名反序列化子對象? 舉個例子。 但是,該解決方案並不適合您的情況,因為同一對象中還有其他屬性沒有動態鍵( bankNametotalAmount ),並且這些屬性的值是基元,而動態屬性的值是一系列銀行賬戶。 這里更好的解決方案是使用JsonConverter

在我們開始之前,我們需要設置一個類結構來反序列化。 這非常簡單:

class RootObject
{
    public List<Bank> BankDetails { get; set; }
}

[JsonConverter(typeof(BankConverter))]
class Bank
{
    public string BankName { get; set; }
    public decimal TotalAmount { get; set; }
    public List<Account> Accounts { get; set; }
}

class Account
{
    [JsonProperty("sNo")]
    public int SequenceNumber { get; set; }
    [JsonProperty("acNo")]
    public string AccountNumber { get; set; }
    [JsonProperty("acBalance")]
    public decimal Balance { get; set; }
}

您會注意到我在Account類中添加了一些[JsonProperty]屬性,以將 JSON 中的速記屬性名稱映射到該類中更友好的屬性名稱。 Bank類上的[JsonConverter]屬性告訴序列化器我們將使用自定義BankConverter來處理該類。

這是BankConverter的代碼。 它在內部使用JObject以使其更易於閱讀和使用 JSON。

class BankConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Bank);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);
        Bank bank = new Bank();
        // populate the known properties (bankName and totalAmount)
        serializer.Populate(obj.CreateReader(), bank);
        // now handle the dynamic key
        bank.Accounts = obj[bank.BankName].ToObject<List<Account>>(serializer);
        return bank;
    }

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

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

有了這些類,您可以像這樣反序列化 JSON:

var root = JsonConvert.DeserializeObject<RootObject>(json);

這是一個工作演示: https : //dotnetfiddle.net/knsRLv

暫無
暫無

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

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