提问人:Alan 提问时间:7/2/2023 最后编辑:Alan 更新时间:7/2/2023 访问量:48
如何循环访问“项目”并提取属性和值 (VB Net/c#)
How do I iterate over "Items" and extract properties and values (VB Net/c#)
问:
我想遍历下面所示的 json 中的项目。并非每个项目都具有所有相同的字段/键值。 我要遍历的项目位于“items”:
如何迭代这些项目? 我可以将项目放入名为 Items 的数组中: 将 ParseJson 调暗为 JObject = JObject.Parse(APIReturn) Dim Items = ParseJson.SelectToken(“items”)。ToString()
如何遍历此数组,并从每个项目中提取值?
当我拿到每个项目时,我想提取“标题”、“日期”和“类别”。如何从 json 中获取这些值?
{
"title": "Massapequa Park July 2023",
"date": "2023-07-01T20:52:43.581Z",
"location": {
"title": "Massapequa Park, New York, USA",
"city": "Massapequa Park",
"tzid": "America/New_York",
"latitude": 40.68038,
"longitude": -73.45512,
"cc": "US",
"country": "United States",
"admin1": "New York",
"asciiname": "Massapequa Park",
"geo": "geoname",
"geonameid": 5126187
},
"range": {
"start": "2023-07-01",
"end": "2023-07-08"
},
"items": [
{
"title": "Holiday 1",
"date": "2023-07-01",
"hdate": "H1",
"category": "Holiday ",
},
{
"title": "Meeting: 9:19pm",
"date": "2023-07-01T21:19:00-04:00",
"category": "Meeting",
"title_orig": "Meeting",
},
{
"title": "MiniFast begins",
"date": "2023-07-06T03:42:00-04:00",
"category": "fast",
"subcat": "mini fast",
"memo": "short fast"
},
{
"title": "Stop Mini Fast",
"date": "2023-07-06",
"hdate": "Hold 1",
"category": "fast",
"subcat": "mini fast",
"memo": "short fast"
},
{
"title": "Fast ends",
"date": "2023-07-06T21:08:00-04:00",
"category": "Light",
"subcat": "fast",
"memo": "Old Shirt"
},
{
"title": "18 Before Dusk: 8:09pm",
"date": "2023-07-07T20:09:00-04:00",
"category": "Ready Lights",
"title_orig": "18 Before Dusk",
"memo": "Nachos"
},
{
"title": "Holiday 7",
"date": "2023-07-08",
"hdate": "7th Holiday",
"category": "Holiday ",
},
{
"title": "Meeting: 9:17pm",
"date": "2023-07-08T21:17:00-04:00",
"category": "Meeting",
"title_orig": "Meeting",
}
]
}
答:
1赞
Dai
7/2/2023
#1
假设您使用的是 ,那么它很简单:Newtonsoft.Json
- 在响应正文 () 上使用,然后验证解析的是否为 (因为它可以是文字、 或其他内容)。
JToken.Parse
APIReturn
JToken
JObject
null
JArray
- 用于获取属性。
JObject.Property("items")
JProperty
"items":
- 验证 是 a(而不是 or other 或其他东西)。
JProperty.Value
JArray
null
JObject
- 遍历 in that : 测试每个值以验证它是否是(或使用 Linq 的),然后安全地提取所需的值。
JTokens
JArray
JObject
OfType<JObject>()
像这样的东西:
String jsonText = ... // await File.ReadAllTextAsync( @"2023-07-01-json.txt" );
if( JToken.Parse( jsonText ) is JObject root )
{
if( root.Property( "items" ) is JProperty p && p.Value is JArray items )
{
var extractedItems = items
.OfType<JObject>()
.Select( o => (
title : o.Property( "title" )?.Value.ToString(),
date : o.Property( "date" )?.Value.ToString(),
category: o.Property( "category" )?.Value.ToString()
) )
.ToList();
extractedItems.Dump(); // `Dump` is a LinqPad method
}
}
截图证明:
(忽略 LinqPad 将 ValueTuple 成员名称报告为 Item1
、Item2
和 Item3
的方式:C# IntelliSense 将允许你通过代码中的名称标题
、日期
和类别
正确地取消引用这些成员)。
评论
0赞
Alan
7/3/2023
感谢您的详细解释和证据!
1赞
Serge
7/2/2023
#2
您可以使用此代码
Dim Items As JArray = JObject.Parse(jsonString).SelectToken("items")
Dim result = Items.Select(Function(x)
Return New With {Key .Title = x("title").ToString,
Key .Category = x("category").ToString}
End Function).ToList()
评论
0赞
Alan
7/3/2023
很简单。我喜欢。将把它作为我的解决方案来实现。谢谢
下一个:VB.NET 动态多维集合
评论