使用LINQ解析JSON数据

本文关键字:数据 JSON 解析 LINQ 使用 | 更新日期: 2023-09-27 18:27:29

所以,我有一些数据,如下所示:

[
  {
    "Name": "Jonh ",
    "Order": [
      {
        "Product": {
          "Id": 8
        },
        "Quantity": 1
      },
      {
        "Product": {
          "Id": 19
        },
        "Quantity": 8
      }
    ]
  },
  {
    "Name": "Jane Doe 1",
    "Order": [
      {
        "Product": {
          "Id": 26
        },
        "Quantity": 7
      },
      {
        "Product": {
          "Id": 44
        },
        "Quantity": 2
      },
      {
        "Product": {
          "Id": 21
        },
        "Quantity": 6
      },
      {
        "Product": {
          "Id": 48
        },
        "Quantity": 2
      },
      {
        "Product": {
          "Id": 35
        },
        "Quantity": 2
      },
      {
        "Product": {
          "Id": 43
        },
        "Quantity": 1
      }
    ]
  }
]

UPDATE:JSON已经使用NewtonSoft.JSON.JsonConvert进行了解析
我对Linq完全陌生,我能够在JavaScript中做到这一点。我需要一个linq查询,提取最畅销的人订购的已售出产品
所以:它聚合了每一种产品,并将售出的数量相加,然后将订单的数量相加。

这就是我现在拥有的:

var products = clientSales.SelectMany(m => m.Order).Select(f=>f.Product.Id).Distinct();

这给了我一个不同产品ID的列表。。。

使用LINQ解析JSON数据

你几乎是对的,首先你应该在Order中使用SelectMany,然后在Quantity中使用OrderByDescending,最后选择以获得产品id,就像下面的代码一样:

var products = clientSales.SelectMany(m => m.Order)
                          .OrderByDescending(x => x.Quantity)
                          .Select(p => p.Product.Id)
                          .Distinct();

输出:

19
26
21
44
48
35
8
43

你可以在这里看到它的工作原理:https://dotnetfiddle.net/6sb3VY

假设您有以下类:

public class Customer
{
    public string Name { get; set; }
    public List<Item> Order { get; set; }
}
public class Item
{
    public Product Product { get; set; }
    public int Quantity { get; set; }
}
public class Product
{
    public int Id { get; set; }
}

您可以生成一个产品ID和销售数量的列表,按数量降序排列,如下所示:

 string json = "[{'"Name'": '"Jonh '",'"Order'": [{'"Product'": {'"Id'": 8},'"Quantity'": 1},{'"Product'": {'"Id'": 19},'"Quantity'": 8}]},{'"Name'": '"Jane Doe 1'",'"Order'": [{'"Product'": {'"Id'": 26},'"Quantity'": 7},{'"Product'": {'"Id'": 44},'"Quantity'": 2},{'"Product'": {'"Id'": 21},'"Quantity'": 6},{'"Product'": {'"Id'": 48},'"Quantity'": 2},{'"Product'": {'"Id'": 35},'"Quantity'": 2},{'"Product'": {'"Id'": 43},'"Quantity'": 1}]}]";
 var deserializedObject = JsonConvert.DeserializeObject<List<Customer>>(json);
 var groupedProducts = from product in deserializedObject.SelectMany(c => c.Order)
                       group product by product.Product.Id into grpProduct
                       select new
                       {
                            ProductId = grpProduct.Key,
                            Quantity = grpProduct.ToList().Sum(p => p.Quantity)
                       };
// Produces the ordered list of product IDs and quantity sold sorted by quantity descending
var orderedProducts = groupedProducts.OrderByDescending(p => p.Quantity).ToList();

这将最终根据您的输入生成以下匿名对象列表:

Product ID      Quantity
19              8
26              7
21              6
44              2
48              2
35              2
8               1
43              1