为什么这个 JSON 没有被正确读取?

3

我有一个按国家排列并按男女分类的JSON大名单。我想能够在Unity中访问这些名称,以将它们应用于各种生成的游戏角色等。但是,在尝试执行此操作时,我收到了空引用错误,但是我已经没有任何想法如何解决它。

我尝试创建字典来访问这些名称。以下是JSON的示例:

//json example

{
    "India":{
       "male":[
          "A_Jay",
          "Aaban",
          "Aabid",
          "Aabir",
          "Aadam"
        ],
       "female":[
          "A_Jay",
          "Aaban",
          "Aabid",
          "Aabir",
          "Aadam"
        ]
    },
    "Usa":{
       "male":[
          "A_Jay",
          "Aaban",
          "Aabid",
          "Aabir",
          "Aadam"
        ],
       "female":[
          "A_Jay",
          "Aaban",
          "Aabid",
          "Aabir",
          "Aadam"
        ]
    }
}

这是我尝试读取JSON文件的代码:

//jsonreader.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FirstName {
    public List<string> male;
    public List<string> female;
}

public class FirstNames {
    public Dictionary<string, FirstName> countries;
}

public class JSONReader : MonoBehaviour {
    public TextAsset jsonFile;

    void Start(){
        FirstNames firstNamesInJson = JsonUtility.FromJson<FirstNames>(jsonFile.text); 
        Debug.Log("Found name: " + firstNamesInJson.countries["India"].male[0]); 
    } 
}

我的调试日志返回了一个空引用错误,我不确定原因。

2个回答

3

你的根 JSON 元素是一个 JSON 对象,它没有 countries 属性,因此你不需要 "root" 对象 FirstNames,直接使用 Dictionary<string, FirstName> 即可:

var firstNamesInJson = JsonUtility.FromJson<Dictionary<string, FirstName>>(jsonFile.text); 

P.S.

感谢评论区的@derHugo - Unity 内置的 JsonUtility 目前不支持 Dictionary 反序列化(文档),因此您需要使用第三方库进行这种动态反序列化,例如 Newtonsoft.Json


@camelMilk_,你似乎对数据类型的概念感到困惑。我认为你可以通过充分理解返回类型、数据类型、类、变量和接口等知识来提高自己的能力。我基于你在这里提出的问题做出了这个判断。 - Morten Bork
@MortenBork,我知道我需要提高自己的知识水平,这就是我来这里的原因。 - camelMilk_
@camelMilk_ 请不要把我的评论看作是敌意,它们并不是!我试图指导你提高自己的能力。数据类型的概念似乎是当前的一个弱点。数据类型基本上是对象在内存中存储方式的“模板”,以及需要为任何要存储的数据值保留多少内存。因此,“List<SomeObject>”与“SomeObject”不同。列表需要更多的空间,就像int与long或string与char等一样。对于SomeClass与int等,情况也是如此。编译器只能将值分配给其定义的类型。 - Morten Bork
Unity内置的JsonUtility使用普通的Unity序列化规则..Dictionary不被其支持...主要答案是:首先你需要一个第三方JSON库。 - derHugo
@derHugo 提供了非常有用的信息! - camelMilk_
显示剩余4条评论

2

Unity内置的JsonUtility使用普通的Unity序列化规则.. 字典不被支持...主要答案是:

首先,您需要一个第三方JSON库!

例如Newtonsoft JSON.Net(它作为软件包提供),然后如前所述,您的JSON没有

请参见反序列化字典

void Start(){
    var firstNamesInJson = JsonConvert.DeserializeObject<Dictionary<string, FirstName>>(jsonFile.text); 
    Debug.Log("Found name: " + firstNamesInJson.countries["India"].male[0]); 
} 

感谢您的回答,我通过更改JSON并添加额外的步骤来创建我的字典,成功读取了数据。非常感谢! - camelMilk_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接