NewtonSoft:从对象数组中提取相同的属性

NewtonSoft: Extract same attribute from An Array of objects

我从网络 API 收到以下 JSON。

{"total_rows":5,"offset":0,"rows":[
{"id":"a:d1","key":"a:d1","value":{"rev":"1-d8e292f1d70505a11be43effaade798b"}},
{"id":"a:d2","key":"a:d2","value":{"rev":"1-a6d5df7769b00e147a3be2a564ffb0e4"}},
{"id":"a:d3","key":"a:d3","value":{"rev":"1-a90506b1445931825a09e7ef5658bc1a"}},
{"id":"b:d4","key":"b:d4","value":{"rev":"1-803b2ff44fe97407a918c6cabc294822"}},
{"id":"b:d5","key":"b:d5","value":{"rev":"1-7e305ced65c3c36070d1adf1bbe1b2ff"}}
]}

我需要读取所有“id”值并将它们加载到 C# 中的字符串数组中。 本质上是给我一个字符串数组,例如

["a:d1"]
["a:d2"]
["a:d3"]
["b:d4"]
["b:d5"]

但是我无法将 JSON 反序列化为已知对象 class,因为 JSON 的结构可能会改变,但可以保证“行”和“id”的存在。

我是 JSON 和 C# 的新手,非常感谢任何帮助。

提前感谢您的时间和精力。

the structure of JSON may change, but presence of "rows" & "id" is guaranteed

那么你关心的结构就不会改变。只需为该结构定义 类:

public class MyRow
{
    public string id { get; set; }
}

public class MyObject
{
    public IEnumerable<MyRow> rows { get; set; }
}

并反序列化为该对象:

var obj = JsonConvert.DeserializeObject<MyObject>(json);

然后您可以将行映射到数组:

var result = obj.rows.Select(r => r.id);

您可以从具有 SelectTokens

的行中获取所有 ID
var jObject = JObject.Parse(jsonString);
var result = jObject.SelectTokens("rows[*].id").Select(w => w.ToString()).ToArray();
// result => ["a:d1","a:d2","a:d3","b:d4","b:d5"]