【问题标题】:Filter JSON Array based on element value in C#基于 C# 中的元素值过滤 JSON 数组
【发布时间】:2022-01-18 06:24:16
【问题描述】:

我有这个 JSON 通过使用:var root = JToken.Parse(myInputJson);

{{
  "results": [
    {
      "orderId": "A123456789",
      "genId": 3,
      "invoiceId": "001",
      "locId": "D07",
      "group": "",
      "assignedUserId": "TEST",
      "billTo": 66537,
      "shipTo": 66537,
      "shipToName": "CONSTRUCTION TEST",
      "pickCount": "1",
      "shipBy": "UPS",
      "isFromMultipleZones": false,
      "taskState": "Assigned",
      "boxes": []
    },
    {
      "orderId": "B987654321",
      "genId": 3,
      "invoiceId": "001",
      "locId": "D08",
      "group": "",
      "assignedUserId": "",
      "billTo": 66537,
      "shipTo": 66537,
      "shipToName": "CONSTRUCTION TEST",
      "pickCount": "4",
      "shipBy": "UPS",
      "isFromMultipleZones": false,
      "taskState": "Assigned",
      "boxes": []
    }
  ]
}

我需要获取大括号之间 orderId = "B987654321" 的所有元素。

经过研究,我已经做到了这一点,但没有生产出我需要的东西:

var root = JToken.Parse(myInputJson);
var values = root.Where(t => (string)t["orderId"] == "B987654321").ToList();

我想我已经接近了,谁能看到我的错误在哪里?

【问题讨论】:

  • root 是一个对象,而不是结果数组。你必须做 root["results"]。

标签: c# json parsing


【解决方案1】:

你忘了用"results"索引root

var root = JToken.Parse(text);
var values = root["results"].Where(t =>(string)t["orderId"] == "B987654321");

另外,您的示例 JSON 格式错误。如果您删除第一个左大括号 ({),它会起作用

【讨论】:

    【解决方案2】:

    要以 JToken 的形式获得订单,您可以使用此代码

    var results = JObject.Parse(json).SelectToken("results").ToArray();
    
    var jsonOrder =  results.First(o => o.SelectToken("orderId").ToString() == "B987654321");
    

    但是由于您使用的是 c# ,因此使用 Order 类的实例而不是 JToken 更容易和更安全

    Order order=jsonOrder.ToObject<Order>();
    

    订单类

        public partial class Order
        {
            [JsonProperty("orderId")]
            public string OrderId { get; set; }
    
            [JsonProperty("genId")]
            public long GenId { get; set; }
    
            [JsonProperty("invoiceId")]
            public string InvoiceId { get; set; }
    
            [JsonProperty("locId")]
            public string LocId { get; set; }
    
            [JsonProperty("group")]
            public string Group { get; set; }
    
            [JsonProperty("assignedUserId")]
            public string AssignedUserId { get; set; }
    
            [JsonProperty("billTo")]
            public long BillTo { get; set; }
    
            [JsonProperty("shipTo")]
            public long ShipTo { get; set; }
    
            [JsonProperty("shipToName")]
            public string ShipToName { get; set; }
    
            [JsonProperty("pickCount")]
            [JsonConverter(typeof(ParseStringConverter))]
            public long PickCount { get; set; }
    
            [JsonProperty("shipBy")]
            public string ShipBy { get; set; }
    
            [JsonProperty("isFromMultipleZones")]
            public bool IsFromMultipleZones { get; set; }
    
            [JsonProperty("taskState")]
            public string TaskState { get; set; }
    
            [JsonProperty("boxes")]
            public List<object> Boxes { get; set; }
        }
    

    但是将整个 json 反序列化为网络对象而不是解析要容易得多。您可以使用 linq 获取任何数据。

    List<Order> orders  =JsonConvert.DeserializeObject<Root>(json).Orders;
    Order order =  orders.First(o => o.OrderId == "B987654321");
    

    根类

    public partial class Root
    {
        [JsonProperty("results")]
        public List<Order> Orders { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多