C#中根据元素值过滤JSON数组

Filter JSON Array based on element value in C#

我有这个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 索引为 "results":

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

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

要获取 JToken 订单,您可以使用此代码

var results = JObject.Parse(json).SelectToken("results").ToArray();

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

但是由于您使用的是 c# ,因此使用 Order class 的实例而不是 JToken

更容易也更安全
Order order=jsonOrder.ToObject<Order>();

订单class

    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");

根目录class

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