C# NET反序列化为具有对象键/名称的复杂类型
我在项目中使用Newtonsoft JSON.NET进行大部分API/JSON使用,通常反序列化或转换为复杂类型以便于使用。问题是,我似乎无法找到一种处理具有动态名称/键的对象的好方法(即每次都不同) 我需要解析的JSON并不完全符合标准,但目前我无法更改它。下面是相关的JSON(我没有包括整个结构) 代码当前看起来像:C# NET反序列化为具有对象键/名称的复杂类型,c#,json.net,C#,Json.net,我在项目中使用Newtonsoft JSON.NET进行大部分API/JSON使用,通常反序列化或转换为复杂类型以便于使用。问题是,我似乎无法找到一种处理具有动态名称/键的对象的好方法(即每次都不同) 我需要解析的JSON并不完全符合标准,但目前我无法更改它。下面是相关的JSON(我没有包括整个结构) 代码当前看起来像: var jResponse = Newtonsoft.Json.Linq.JObject.Parse(rResponse.Content); var jOrders = jRe
var jResponse = Newtonsoft.Json.Linq.JObject.Parse(rResponse.Content);
var jOrders = jResponse["orders"];
foreach (var jChild in jOrders) {
string sOrderGUID = ""; //The name/key of the object
var jOrder = jChild.First.ToObject<Order>();
//Handle the order data, etc
}
我一直在考虑将其转换为JObject,并使用属性来获取密钥,但如果可能的话,我更喜欢一种更干净的方法。有什么建议吗
更新:字典解决方案在订单情况下运行良好,但在尝试将相同的方法应用于JSON的另一部分时,我遇到了另一个问题
"rates": {
"sek": {
"name": "Swedish Krona",
"usd": {
"name": "US Dollar",
"rates": {
"2014-10-01T12:14:26.497Z": 0.138794,
"2014-10-01T12:17:51.143Z": 0.138794,
"2014-10-01T12:26:26.827Z": 0.138794,
"2014-10-01T12:51:03.347Z": 0.138794
}
}
},
"usd": {
"name": "US Dollar",
"sek": {
"name": "Swedish Krona",
"rates": {
"2014-10-01T12:14:28.763Z": 7.20753,
"2014-10-01T12:17:52.667Z": 7.20753,
"2014-10-01T12:26:28.477Z": 7.20753,
"2014-10-01T12:51:04.963Z": 7.20753
}
}
}
}
问题是我需要收集“name”值和其他值,但货币代码是可变的。考虑使用嵌套字典,但似乎找不到捕获“名称”的方法
var result = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Order>>>(jsonString);
var result=JsonConvert.DeserializeObject(jsonString);
在json字符串中,首先有一个名为“orders”的键,如果是外部字典,则该键将与字符串键匹配,然后内部字典字符串键将与order键匹配,并且该值将被解析为order,因为orderYes字典是更好的答案
var orderWrapper = JsonConvert.DeserializeObject<OrderWrapper>(json);
IEnumerable<Order> orders = result.GetOrders();
public class OrderWrapper
{
[JsonProperty("orders")]
private Dictionary<string, Order> _orders;
public IEnumerable<Order> GetOrders()
{
return _orders.Values;
}
}
var orderWrapper=JsonConvert.DeserializeObject(json);
IEnumerable orders=result.GetOrders();
公共类OrderWrapper
{
[JsonProperty(“订单”)]
私人字典(订购),;
公共IEnumerable GetOrders()
{
返回_orders.Values;
}
}
这正是我前进所需要的,但是你知道如何解决更新后的问题吗?有点复杂,请查看此处的评论。我的建议是使用一个模型,通过查询解析的JObject
来解析和填充,即var data=JsonConvert.DeserializeObject(json)作为JObject
。嵌套字典在这里不是一个很好的选择。
var result = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Order>>>(jsonString);
var orderWrapper = JsonConvert.DeserializeObject<OrderWrapper>(json);
IEnumerable<Order> orders = result.GetOrders();
public class OrderWrapper
{
[JsonProperty("orders")]
private Dictionary<string, Order> _orders;
public IEnumerable<Order> GetOrders()
{
return _orders.Values;
}
}