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

本文关键字:类型 复杂 对象 反序列化 NET JSON | 更新日期: 2023-09-27 18:25:09

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

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

"orders": {
  "32f5c31d-a851-40cf-a8bb-2fea4bd27777": {
    "orderId": "ord12345",
    "state": "new",
    "sellAmount": "200",
    "paymentMethod": "buyMethod2",
    "email": "example@email.com",
    "pinOrPhonenumber": "180012345",
    "timestamp": "2014-10-01T07:13:33.868Z"
  },
  "123d98d5-19b1-4cb3-8ab3-b991650b134c": {
    "orderId": "ord12346",
    "state": "pending",
    "sellAmount": "1200",
    "paymentMethod": "buyMethod2",
    "email": "example@email.com",
    "pinOrPhonenumber": "180012345",
    "timestamp": "2014-10-01T07:13:33.868Z"
  }
}

代码当前看起来像:

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
}

类别:

public class Order {
  [JsonProperty("orderId")]
  public string sOrderID { get; set; }
  [JsonProperty("state")]
  public string sState { get; set; }
  [JsonProperty("sellAmount")]
  public decimal nAmount { get; set; }
  [JsonProperty("paymentMethod")]
  public string sPaymentMethod { get; set; }
  [JsonProperty("email")]
  public string sEmail { get; set; }
  [JsonProperty("phonenumber")]
  public string sPhonenumber { get; set; }
  [JsonProperty("paymentMessage")]
  public string sPaymentMessage { get; set; }
  [JsonProperty("timestamp")]
  public DateTime dTimestamp { get; set; }
}

我一直在考虑将其转换为JObject,并使用Properties来获取密钥,但如果可能的话,我更喜欢一种更干净的方法。有指针吗?

更新:Dictionary解决方案在订单情况下运行良好,但在尝试将相同的方法应用于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"值以及其他值,但货币代码是可变的。考虑使用嵌套字典,但似乎找不到捕获"名称"的方法。

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

Yes dictionary是一个更好的答案。

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

我试图在下面的行中解析您的JSON

var result = JsonConvert.DeserializeObject<Dictionary<string,  Dictionary<string,Order>>>(jsonString);

在json字符串中,首先有一个名为"orders"的键,如果是外部字典,它将与字符串键匹配,然后内部字典的字符串键将与order键匹配,并且该值将被解析为order