C# NET反序列化为具有对象键/名称的复杂类型

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

我在项目中使用Newtonsoft JSON.NET进行大部分API/JSON使用,通常反序列化或转换为复杂类型以便于使用。问题是,我似乎无法找到一种处理具有动态名称/键的对象的好方法(即每次都不同)

我需要解析的JSON并不完全符合标准,但目前我无法更改它。下面是相关的JSON(我没有包括整个结构)

代码当前看起来像:

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,因为order

Yes字典是更好的答案

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;
    }
}