JSON 反序列化嵌套响应

JSON deserializing nested response

我在反序列化来自 API(.NET6,使用 System.Text.Json)的响应时遇到新手问题。 我使用这个成功地得到了响应:

    var itemresponse = await response.Content.ReadFromJsonAsync<JSON_Item>();

我在“itemresponse”中获得了预期的所有嵌套值,在 VS 调试器中完全可见。 现在我希望遍历响应并提取相关值 - 看起来简单明了...

第一期:

我可以像这样从第一层提取值:

string test1 = itemresponse.product.title;

但是,我无法从变体中获取嵌套值,如下所示:

string test2 = itemresponse.product.variants.sku;

“变体”中的所有属性都是未知的,我无法在 Visual Studio 中“点”它们。

第二期:

我正在尝试使用以下循环遍历响应中的所有值:

foreach (var w in itemresponse.product)
{
    string test = w.vendor;         // Works
    string test2 = w.variants.sku;  // sku not recognizable
}                                                               

我知道我的“itemresponse”不是一个列表,但我希望无论如何都能遍历该对象。 哔.. 不可能。我明白了: “foreach 无法对类型为“Product”的变量进行操作,因为“Product”不包含“GetEnumerator”的 public 实例或扩展定义。

好的,我做一些修改:

var itemresponse = await response.Content.ReadFromJsonAsync<List<JSON_Item>>();
foreach (var w in itemresponse)
{
    string test = w.product.vendor;     // Works
    string test2 = w.product.variants.sku;  // sku still not recognizable
}                                                               

尝试 运行,我得到这个: JsonException:无法将 JSON 值转换为 System.Collections.Generic.List`1[Project.Models.JSON_Item]。路径:$ |行号:0 | BytePositionInLine: 1.

我被卡住了,我不知道如何从“变体”中获取嵌套值。 请使用“最佳实践”寻求帮助。

非常感谢。

勒内

以下是我使用的类:

public class JSON_Item
{
    public Product product { get; set; }
}

public class Product
{
    public long? id { get; set; }
    public string title { get; set; }
    public string body_html { get; set; }
    public string vendor { get; set; }
    public List<Variant> variants { get; set; }
}

public class Variant
{
    public long? id { get; set; }
    public long? product_id { get; set; }
    public string? title { get; set; }
    public string? price { get; set; }
    public string? sku { get; set; }
}

响应示例 JSON:

{
   "product":{
      "id":6912905806009,
      "title":"This is the title",
      "body_html":"Description here...",
      "vendor":"Cronus Inc.",
      "variants":[
         {
            "id":40775169605817,
            "product_id":6912905806009,
            "title":"Variant 1",
            "price":"899.00",
            "sku":"5710698076083"
         }
      ]
   }
}

编辑:像嵌套的 foreach 循环这样的东西会持久吗?

foreach (var q in itemresponse.product)
{
    string title = q.product.title;

    foreach (var w in itemresponse.product.variants)
    {
        string test = w.sku;
    }
}

如果是这样,我该如何连接循环以确保变体链接到正确的产品循环通过我的 JSON 对象?

我想知道对此的“最佳实践”解决方案是什么?猜猜这是从嵌套 JSON 对象中提取值的非常普遍的需求?

对于第一期(和第二期,稍后会详细介绍),您无法直接在变体列表中访问 SKU。在你的例子中:

string test1 = itemresponse.product.title;

有效,因为标题是产品 object 的 属性。

string test2 = itemresponse.product.variants.sku;

不起作用,因为变体列表没有 SKU 属性。您需要访问变体列表中的特定变体 object 才能获取 SKU。例如,您可以执行以下操作:

foreach (var variant in itemresponse.product.variants) {
    Console.WriteLine(variant.sku);
}

对于第二个问题,在您的示例中,您将 object(项目响应和产品)视为列表并尝试对它们进行 foreach。这是无效的。您只能对可迭代的数据结构(例如列表或数组)进行 foreach。如果您从这些代码片段中删除 foreach,那么您将遇到与第一次相同的问题,您试图从变体列表中访问变体 object 的 属性 , 也是无效的。