我正在尝试从api获取JSON数据。
我有一个json:
{
"elements": [
{
"id": 1,
"name": "Bob",
"address": "abc street",
"hobbies": {
"indoor": "Games, reading books",
"outdoor": ""
}
},
{
"id": 2,
"name": "Mark",
"address": "def street",
"hobbies": {
"indoor": "Games, reading books",
"outdoor": ""
}
}
]
}
我随身携带以下代码:
using(var httpClient = new HttpClient()) {
HttpResponseMessage response = httpClient.GetAsync("api_url_here").Result;
var studentJsonString = response.Content.ReadAsStringAsync().Result;
var Jsresult = new JavaScriptSerializer().Deserialize<dynamic>(studentJsonString).ToString();
JObject jObject = JObject.Parse(Jsresult);
IEnumerable<dynamic> listDyn = jObject[0].Select(items => new StudentModel// gives error here as whole
{
id = items["id"].ToString(),
name = items["name"].ToString(),
address= items["address"].ToString()
});
}
但是当我调用上面的方法时,它给了我一个错误:
'访问的JObject值具有无效键值:1。应为对象属性名称。'
我缺少什么?
为什么要反序列化两次?的结果
JavaScriptSerializer().Deserialize(customerJsonString)
已是对象。您不需要使用JObject.Parse()
再次解析它。你可以直接做
JObject jObject= JObject.Parse(customerJsonString)
此外,CCD_ 2的结果是字典而不是数组。它有属性,您可以通过它们的名称访问这些属性。例如
jObject["elements"]
当然,编译器不可能预测jObject["elements"]
将是IEnumerable
,所以你必须确保这一点。
jObject.Value<JArray>("elements").Select(item => ...)
这将读取jObject
的属性elements
作为JArray
。