首页 > 解决方案 > 如何使用 linq 搜索 json 响应以查看值是否存在?

问题描述

我有以下 json 响应

{
  "Id": "1234",
  "Name": "Test",
  "Orders": [
    {
      "OrderId": "87654",
      "OrderDetails": {
        "OrdId": "1234",
        "Name": "Desk"
      }
    },
    {
      "OrderId": "54213",
      "OrderDetails": {
        "OrdId": "4321",
        "Name": "Table"
      }
    }
  ]
}

我想搜索订单列表,看看是否有 87654 的 OrderId。我可以使用数组,但如何使用 Linq 呢?

标签: c#jsonlinq

解决方案


您可以使用 Newtonsoft.Json 将 json 字符串反序列化为 JObject,然后遍历订单以获取 OrderID。

var obj = JObject.Parse(json);
foreach(var order in obj["Orders"])
{
    Console.WriteLine(order["OrderId"]);
}

或者您可以使用 Where 子句。

var myOrder = obj["Orders"].Where(x => x["OrderId"].ToString().Equals("87654")).FirstOrDefault();

然后您可以打印该订单的任何属性,

Console.WriteLine(myOrder["OrderDetails"]["Name"].ToString());
// Prints: Desk

或者,您可以:还使用类来反序列化您拥有的 json 并查询订单。

public class OrderDetails
{
    public string OrdId { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public string OrderId { get; set; }
    public OrderDetails OrderDetails { get; set; }
}

public class RootObject
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }
}

public static void Main(string[] args) 
{
    string json = File.ReadAllText(@"C:\temp\json.txt");
    var obj = JsonConvert.DeserializeObject<RootObject>(json);
    var myOrder = obj.Orders.FirstOrDefault(x => x.OrderId.Equals("87654"));
    if (myOrder != null)
    {
        Console.WriteLine(myOrder.OrderDetails.Name);
    }
}

推荐阅读