[英]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>
代替常规类。 请参阅如何使用动态(数字)键名反序列化子对象? 举个例子。 但是,该解决方案并不适合您的情况,因为同一对象中还有其他属性没有动态键( bankName
和totalAmount
),并且这些属性的值是基元,而动态属性的值是一系列银行账户。 这里更好的解决方案是使用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.