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 的 属性 , 也是无效的。
我在反序列化来自 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 的 属性 , 也是无效的。