【问题标题】:How can i search a json response to see if a value exists using linq?如何使用 linq 搜索 json 响应以查看值是否存在?
【发布时间】:2020-02-17 05:36:06
【问题描述】:

我有以下 json 响应

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

我想搜索订单列表,看看是否有 87654 的 OrderId。 我可以用数组做,但我怎么能用 Linq 做呢?

【问题讨论】:

  • 你能edit你的帖子并添加你现在使用的代码来反序列化(我希望你这样做)然后搜索它吗?
  • 我使用下面的 public class OrderDetails { public string OrdId { get;放; } 公共字符串名称 { 获取;放; } } 公共类订单 { 公共字符串 OrderId { 获取;放; } 公共订单详情订单详情 { 获取;放; } } 公共类 RootObject { 公共字符串 ID { 获取;放; } 公共字符串名称 { 获取;放; } public List 订单 { get;放; } } 反序列化 JsonConvert.DeserializeObject(json) :
  • 对任务使用动态对象。
  • 您应该将代码编辑到您的问题中。

标签: c# json linq


【解决方案1】:

您可以使用 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);
    }
}

【讨论】:

    【解决方案2】:

    Demo on dotnet fiddle

    你可以使用Newtonsoft来实现

    var jsonData = "{ 'Id': '1234', 'Name': 'Test', 'Orders': [ {'OrderId': '87654', 'OrderDetails': { 'OrdId': '1234', 'Name': 'Desk' } }, { 'OrderId': '54213', 'OrderDetails': { 'OrdId': '4321','Name': 'Table' }}]}";
    
     var desirializedData = JsonConvert.DeserializeObject<MyObject>(jsonData);
     var result = desirializedData.Orders.Where(p => p.OrderId == 87654);
            foreach(var master in result)
            {
                Console.WriteLine(master.OrderId + " " + master.OrderDetails.Name);
            }
    

    【讨论】:

    • desrializedData 被声明为 dynamic ,所以我有以下动态 desirializedData = JsonConvert.DeserializeObject(jsonData);那么我将如何将其用于结果呢?
    • dynamic desirializedData 从我的角度来看,您应该创建新类以便能够反序列化并将其作为属性访问。
    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多