如何循环访问“项目”并提取属性和值 (VB Net/c#)

How do I iterate over "Items" and extract properties and values (VB Net/c#)

提问人:Alan 提问时间:7/2/2023 最后编辑:Alan 更新时间:7/2/2023 访问量:48

问:

我想遍历下面所示的 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",
        }
    ]
}

C# 数组 JSON vb.net

评论

0赞 Alan 7/2/2023
那是个错误,狗在老鼠上跳。更正了它。

答:

1赞 Dai 7/2/2023 #1

假设您使用的是 ,那么它很简单:Newtonsoft.Json

  1. 在响应正文 () 上使用,然后验证解析的是否为 (因为它可以是文字、 或其他内容)。JToken.ParseAPIReturnJTokenJObjectnullJArray
  2. 用于获取属性。JObject.Property("items")JProperty"items":
  3. 验证 是 a(而不是 or other 或其他东西)。JProperty.ValueJArraynullJObject
  4. 遍历 in that : 测试每个值以验证它是否是(或使用 Linq 的),然后安全地提取所需的值。JTokensJArrayJObjectOfType<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
    }
}

截图证明:

enter image description here


(忽略 LinqPad 将 ValueTuple 成员名称报告为 Item1Item2Item3 的方式: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
很简单。我喜欢。将把它作为我的解决方案来实现。谢谢