C#如何从反序列化JSON对象的数组中获取值
解决JsonObject中数组数据的读取问题
别着急,你能成功读取ok字段说明基础的反序列化是没问题的,问题出在处理JSON数组的方式上——直接foreach遍历JsonObject本身只会遍历它的键值对(比如ok和establishments这两个键),而不是数组里的元素。咱们来一步步修正:
先搞清楚你用的JSON库
常见的两种处理方式,对应不同的库,你可以根据自己的情况选:
情况1:使用.NET内置的System.Text.Json
如果你是用JsonSerializer.Deserialize<JsonObject>(jsonString)得到的JsonObject,那需要先把establishments字段转换成JsonArray再遍历:
// 假设jsonString是你从API拿到的原始数据 JsonObject obj = JsonSerializer.Deserialize<JsonObject>(jsonString); // 先确认establishments字段存在且是数组类型 if (obj.TryGetProperty("establishments", out JsonElement establishmentsElem) && establishmentsElem.ValueKind == JsonValueKind.Array) { // 遍历数组里的每个商家对象 foreach (JsonElement item in establishmentsElem.EnumerateArray()) { // 读取name字段,记得做存在性检查避免报错 if (item.TryGetProperty("name", out JsonElement nameElem)) { string shopName = nameElem.GetString(); // 这里就可以用shopName做你需要的操作了,比如打印或者存到集合里 Console.WriteLine(shopName); } } }
情况2:使用Newtonsoft.Json(Json.NET)
如果是用JObject.Parse(jsonString)得到的JObject,处理起来更简洁:
JObject obj = JObject.Parse(jsonString); JArray establishments = (JArray)obj["establishments"]; foreach (JObject shop in establishments) { // 直接读取name字段,也可以用shop["name"]?.ToString()避免空引用 string shopName = (string)shop["name"]; Console.WriteLine(shopName); }
为什么之前的foreach失败?
你之前可能直接写了foreach (var item in obj),这种写法遍历的是JsonObject的键值对集合,也就是会拿到"ok": true和"establishments": [...]这两个条目,而不是数组里的每个商家对象。必须先定位到数组字段,再遍历数组内部的元素才行。
内容的提问来源于stack exchange,提问作者JeroenM
相关产品推荐
相关产品推荐

