如何在 C# 控制器中获取数组 JSON 内的所有对象

How to get all objects inside an array JSON in a C# controller

在下面的 JSON 场景中,如何在 C# 中检索属于名为 [items] 的对象的所有 [names]?

我正在使用购物车 api,并希望在客户进入致谢页面后向客户展示所有列出的属于订单一部分的商品。我在 api 中查看的父对象称为 items 并且它具有子对象数据,例如每个项目的价格、每个项目的名称和每个项目的产品图像等......

在我的控制器中,当我只需要检索简单信息时,我在下面执行此操作,例如订单只有 1 个发票编号、1 个付款方式、1 个送货方式、1 个促销代码等。下面的代码有效并让我下面那个简单场景中的数据。

 using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
            var obj = JObject.Parse(result);

            
            //Order Info
            string invoiceNumber = (string)obj["invoiceNumber"];
            string email = (string)obj["email"];
            string paymentMethod = (string)obj["paymentMethod"];
            string shippingMethod = (string)obj["shippingMethod"];

            //Discount info
            string amountSaved = (string)obj["discounts"][0]["amountSaved"];
            string promoCode = (string)obj["discounts"][0]["code"];

但现在我需要利用一个名为 [items] 的对象(属于订单的商品的数据),该对象将包含许多 names 商品取决于作为客户订单一部分的单个项目的数量。这是我尝试过的,但后来意识到根据我在括号内使用的数字,它只会 return 一条记录。

string items = (string)obj["items"][0]["name"]; //This returned the product at index 0
string items = (string)obj["items"][1]["name"]; //This returned the product at index 1
string items = (string)obj["items"][2]["name"]; //This returned the product at index 2

如何编写语法,以便我可以获取当前驻留在 item 对象中的所有 name 对象,例如?我知道它与反序列化对象和列表有关,但我不知道语法以及如何处理。

关于我如何完成这项工作有什么建议吗?

您可以使用 Newtonsoft json 包将对象转换为 JSON 数组。 参考下面link

http://www.newtonsoft.com/json/help/html/SerializingJSON.htm

最简单的方法

List<string> names = obj["items"].Select(x => (string) x["name"] ).ToList();

测试

Console.WriteLine( string.Join(",",names)); // prod1,prod2

更复杂的方法是创建一个 c# class 并反序列化数据。但在这种情况下,您将能够使用 Linq 进行查询和搜索

 List<Item>  items = obj["items"].Select(x => x.ToObject<Item>()).ToList()

public class Item
{
    public string name { get; set; }
    public double price { get; set; }
    public int quantity { get; set; }
}

结果(采用 json 格式)

[
  {
    "name": "prod1",
    "price": 12.99,
    "quantity": 4
  },
  {
    "name": "prod2",
    "price": 17.65,
    "quantity": 1
  }
]