C#InvalidCastException:指定的强制转换对JSON.Net无效

时间:2019-05-02 06:42:27

标签: c# json unity3d json.net

我试图从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

任何帮助将不胜感激!

4 个答案:

答案 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具有KeyValuePairkey对时,在反序列化JSON时使用value

{
  "ABC" : {
      "X" : "x",
      "Y" : "y",
      "Z" : "z"
  }
}

在上面的json中,ABCKey中的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