c# - JSON .NET 使用对象键/名称反序列化为复杂类型

标签 c# json.net

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

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

"orders": {
  "32f5c31d-a851-40cf-a8bb-2fea4bd27777": {
    "orderId": "ord12345",
    "state": "new",
    "sellAmount": "200",
    "paymentMethod": "buyMethod2",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d0b5a8b1bda0bcb590b5bdb1b9bcfeb3bfbd" rel="noreferrer noopener nofollow">[email protected]</a>",
    "pinOrPhonenumber": "180012345",
    "timestamp": "2014-10-01T07:13:33.868Z"
  },
  "123d98d5-19b1-4cb3-8ab3-b991650b134c": {
    "orderId": "ord12346",
    "state": "pending",
    "sellAmount": "1200",
    "paymentMethod": "buyMethod2",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e18499808c918d84a1848c80888dcf828e8c" rel="noreferrer noopener nofollow">[email protected]</a>",
    "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
}

还有类(class):

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 并使用属性来获取 key ,但如果可能的话,我更喜欢一种更简洁的方法。有什么指点吗?

更新:字典解决方案对于订单情况效果很好,但是当我尝试将相同的方法应用于 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
            }
        }
    }
}

问题是我需要收集“名称”值以及其余值,但货币代码是可变的。考虑使用嵌套字典,但似乎无法找到捕获“名称”的方法。

最佳答案

是的,字典是一个更好的答案。

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

关于c# - JSON .NET 使用对象键/名称反序列化为复杂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26141320/

相关文章:

c# - Json.NET : Serialization with Square Brackets

c# - Json.NET Schema 会忽略 $schema 吗?

c# - 哪个 passwordchar 在 winforms 文本框中显示黑点 (•)?

c# - 如何比较两个忽略 C# 中某些键的 JSON?

c# - 如何使用合约解析器和值提供者在反序列化过程中自定义值设置

c# - 是否始终保证 LINQ 查询的结果顺序正确?

c# - 如何将匿名 json 作为类成员并将所有转换为 c# 中的 json

c# - 基于 bool 值的线程阻塞

c# - 在 ASP.NET Core Web API 应用程序中禁用 Ctrl+C 关闭

c# - CarouselView 与不同的 ContentViews 绑定(bind) ViewModel