在 c# (Unity) 中解析 JSON 文件

Posted

技术标签:

【中文标题】在 c# (Unity) 中解析 JSON 文件【英文标题】:Parsing a JSON file in c# (Unity) 【发布时间】:2021-02-01 08:43:50 【问题描述】:

我正在尝试将我从 JS 应用程序创建的 JSON 文件解析为 C# 中的 Unity。

我一般没有使用 Json 或读取数据的经验,所以我确定我缺少一些基本的东西。

这是数据结构在 JS 中的样子:

function DialIn () 
    this.id = null; this.line = "default in line"; this.links = [];


function DialOut () 
    this.id = null; this.line = "defauLt out line"; this.links = []; this.autoDelete = false;


function DialNode () 
    this.id = null; this.posX = null; this.posY = null; this.ins = []; this.outs = [];

            
var NodesDB = []; //DataBase of dial nodes

简而言之,NodesDB 是一个 DialNode 数组,每个 DialNode 包含一个 ins 数组和一个 outs 数组。

一旦存储在 JSON 中,它看起来像这样(例如,NodesDB 中有 3 个节点)

["id":"dn0","posX":82,"posY":234,"ins":["id":"dn0_in_0","line":"This is dynamic Blep ?","links":[]],"outs":["id":"dn0_out_0","line":"Coucou, this is a reply.","links":["dn1_in_0"],"autoDelete":false],"id":"dn1","posX":520,"posY":171,"ins":["id":"dn1_in_0","line":"This is dynamic Blep ?","links":["dn0_out_0"]],"outs":["id":"dn1_out_0","line":"Coucou, this is a reply.","links":[],"autoDelete":false,"id":"dn1_out_1","line":"Coucou, this is a reply.","links":["dn2_in_0"],"autoDelete":false],"id":"dn2","posX":948,"posY":139,"ins":["id":"dn2_in_0","line":"This is dynamic Blep ?","links":["dn1_out_1"]],"outs":["id":"dn2_out_0","line":"Coucou, this is a reply.","links":[],"autoDelete":false]]

然后,在 Unity 中,我创建了这个结构,试图模仿 JS 中的结构:

    [System.Serializable]
    class DialIn
    
        string id; string line; string[] links;
    


    [System.Serializable]
    class DialOut
    
        string id; string line; string[] links; bool autoDelete;
    


    [System.Serializable]
    class DialNode
    
        string id; int posX, posY; DialIn[] ins; DialOut[] outs;
    

    DialNode[] NodesDB;

从那里,我正在使用这些命令:

path = Application.dataPath + "/Jsons/Bloup.json";
jsonData = File.ReadAllText(path);

我相信我应该使用这样的东西: NodesDB = JsonUtility.FromJson<DialNode>(jsonData);

但显然,事情没那么简单。

任何帮助将不胜感激:o

【问题讨论】:

我创建了一个更简单的脚本版本,没有数组数组和所有这些噪音。 FromJson 在这种情况下运行良好。我认为问题在于我的 Json 不包含一个类,而是一个所述类的数组。不过,我还没有找到解决方法。我正在调查这个:answers.unity.com/questions/1123326/… 【参考方案1】:

将所有对象的成员变量设为public。 JSONUtility 不会(反)序列化私有成员变量。 请参阅documentation。

或者,如果您真的希望您的成员变量私有,请将[SerializeField] 属性添加到您想要序列化的每个字段。

【讨论】:

我已经公开了我的所有课程和 NodesDB,但仍有一些问题。这是我要放置数据的地方:public DialNode[] NodesDB; 但是当我使用命令NodesDB = JsonUtility.FromJson<DialNode>(nodesData); 时出现错误“无法将类型 DialNode 隐式转换为 DialNode []”我不知道如何处理数组,但是我什至不确定使用 FromJson 的语法是否正确。 我可以使用NodesDB = JsonUtility.FromJson<DialNode[]>(nodesData); 解决该错误,但随后我得到:“ArgumentException:JSON 必须表示一个对象类型。” 我猜你需要另一个类来包裹你的节点数组,并且你的 json 不应该以数组作为根开始,而是应该看起来像这样: "nodesDB":[...,...,etc]。这有帮助吗? 确实如此!我一直在阅读 Unity 的解析器不支持 json 文件根目录的数组。我想一旦数据被提取出来,我就可以摆脱这个“容器”了 =)【参考方案2】:

您可以将 simple json 添加到您的项目中,并在您的***脚本中使用它们, 我使用此脚本进行解析和其他...

 var N = JSON.Parse(the_JSON_string);
 var versionString = N[0]["id"].Value;  
 var versionString = N[0]["posX"].Value;  

还有其他......

【讨论】:

以上是关于在 c# (Unity) 中解析 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件

通过 C# 在 Unity 中从 API URL 解析 JSON

C# unity (发布到安卓端中使用)解析json字符串—使用微软官方的包Newtonsoft.Json

C# unity (发布到安卓端中使用)解析json字符串—使用微软官方的包Newtonsoft.Json

C# unity (发布到安卓端中使用)解析json字符串—使用微软官方的包Newtonsoft.Json

如何在统一 C# 中解析来自 JSON 的数据? [复制]