我试图从json文件中打印“项目”中的所有子键(如下所示),但是在此行上得到了无效的强制转换异常:
foreach (KeyValuePair<string, JToken> sub in (JObject)obj2["items"])
我不知道为什么它一直显示此错误。
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class JsonReader : MonoBehaviour
{
[SerializeField]
public string filePath;
[ContextMenu("Load Data")]
private void LoadData()
{
JObject obj2 = JsonConvert.DeserializeObject<JObject>(File.ReadAllText(filePath));
foreach (KeyValuePair<string, JToken> sub in (JObject)obj2["items"])
{
Debug.Log(sub.Key);
}
}
}
JSON文件内容
{
"items": [
{
"id": "143675",
"item": "Action Figure",
"name": "Goku",
"color": "Orange"
},
{
"id": "258943",
"item": "Water Bottle",
"name": "Pcares",
"color": "Silver"
},
{
"id": "326824",
"item": "White Board",
"name": "Boardy",
"color": "White"
},
{
"id": "423168",
"item": "Monitor",
"name": "Dell",
"color": "Black"
}
]
}
我希望预期的输出显示所有键,例如:
id
item
name
color
任何帮助将不胜感激!
答案 0 :(得分:4)
如果仔细观察,键items
下的值是一个数组:
"items": [ // <--- square bracket!
{
"id": "143675",
"item": "Action Figure",
"name": "Goku",
"color": "Orange"
},
要获取的键在数组的元素中。假设数组中总是有项目,则可以执行以下操作:
foreach (KeyValuePair<string, JToken> sub in (JObject)obj2["items"][0])
最后请注意[0]
。这将获得数组的第一项。
答案 1 :(得分:0)
JsonConvert.DeserializeObject的通用类型应该是您的域类类型,以映射属性。
示例:
public class MyItem
{
public int Id { get; set; }
public string Item { get; set; }
}
但是要小心:属性名称和json名称区分大小写应该相等
答案 2 :(得分:0)
您在KeyValuePair<string, JToken>
中使用foreach
但是请注意,当您的JSON具有KeyValuePair
:key
对时,在反序列化JSON时使用value
{
"ABC" : {
"X" : "x",
"Y" : "y",
"Z" : "z"
}
}
在上面的json中,ABC
是Key
中的KeyValuePair
,与ABC关联的整个对象是
Value
中的ABC
。
但是
您的json与上面的略有不同,这意味着您具有与items
键相关联的对象数组
您正在使用(JObject)obj2["items"]
,这意味着您正在items
数组上进行迭代,但是在items
数组内不存在键/值对,只有对象具有
到目前为止,您需要使用类似下面的内容,
foreach (JObject jObject in (JArray)obj2["items"])
{
Debug.Log(jObject["id"].ToString());
Debug.Log(jObject["item"].ToString());
Debug.Log(jObject["name"].ToString());
Debug.Log(jObject["color"].ToString());
}
通过这种方式,您可以检索items
数组内的所有对象
答案 3 :(得分:0)
您已经写了foreach (KeyValuePair<string, JToken> sub in (JObject)obj2["items"])
这里obj2["items"]
是JArray
类型,而不是JObject
invalidCastException
是因为您试图在JArray
语句中将JObject
类型的对象强制转换为foreach
。
按照最终要达到的目标,似乎您已经正确地编写了所有内容,但是错过了在[0]
末尾添加(JObject)obj2["items"]
因此正确的foreach
语句应为:
foreach (KeyValuePair<string, JToken> sub in (JObject)obj2["items"][0]) // you missed to add this [0] in your code