2017-04-03 33 views
1

我想从JSON文件中读取字符串并将其传递给我的UI在Unity中的文本我面临的问题是字符串始终为空, m不知道为什么,现在我找到JSON文件路径并阅读它,但是当我尝试访问字符串时它是空的。我不确定如何阅读json。我真的不明白这是如何工作的。我是JSON格式的新手,我正在尝试练习它。这是我的第一个方法。我使用Unity引擎,和我读使用流媒体资产统一:无法从JSON文件中读取字符串

读取数据从Json的脚本JSON文件:

using UnityEngine; 
using System.IO; 


public class ReadFromJson : MonoBehaviour { 

private string _filePath = "myText.json"; 

Data dh; 

string str; 
void Start() 
{ 



    LoadGameData(); 
} 

public Data getCurrentRoundData() 
{ 
    return dh; 
} 

private void LoadGameData() 
{ 
    string filePath = Path.Combine(Application.streamingAssetsPath, _filePath); 


    if (File.Exists(filePath)) 
    { 

     string dataAsJSON = File.ReadAllText(filePath); 
     DataHolder loadedData = JsonUtility.FromJson<DataHolder>(dataAsJSON); 

     dh = loadedData.data; 
     str = loadedData.data.TextToPass; 
     Debug.Log("My Text is" + dh.TextToPass); 

     Debug.Log("Path Exist"); 

    } 


    else 
    { 
     Debug.LogError("CANNOT LOAD GAME DATA!!"); 
    } 

} 

} 

经理的JSON数据适用于我的UI文本

DataController = FindObjectOfType<ReadFromJson>(); 

    _data = DataController.getCurrentRoundData(); 


    myText.text = _data.TextToPass; 

DataHolder.cs

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

[System.Serializable] 

public class DataHolder { 

public Data data; 

}

JSON文本

{"DataHolder": 

    { 
     "TextToPass":"I'm A Horse" 
    } 

}

Data.cs

[System.Serializable] 
public class Data { 

public string TextToPass ; 
} 

我所得到的是TextToPass为null

+0

你能分享你的DataHolder模型吗? – mindOfAi

+0

是检查更新问题 – Nanopl

+2

您的问题缺乏这么多的东西。你需要发布你正在阅读的json文件。 File.Exists是否返回true?什么是“TextToPass”?你可以看到如何阅读Unity中的json [here](https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity/36244111#36244111)。看起来你想用Json保存GameData。我为[这里](http://stackoverflow.com/a/40966346/3785314)做了一个帮助类。 – Programmer

回答

1

模型具有Data的JSON有DataHolder。 JSON库不会假设“哦,有一个属性,它们必须是这个意思” - 它是按名称排列的,并且名称不匹配。

要么改变你的类型,要么改变JSON。他们需要匹配。作为一个例证,一种形式:

public class Foo { 
    public int Bar {get;set;} 
} 

匹配JSON形式:

{ "Bar": 123 } 
+0

这是否适用于Unity?我认为他们的财产存在问题。 – mindOfAi

+0

我真的..不明白..我没有看到我的问题。什么类型需要改变 – Nanopl

+0

@Nanopl你的根类型是DataHolder;它只有一个Data属性。 json指定了一个DataHolder属性 - 在DataHolder中**不存在**。 json应该是“数据”,或者类型需要改变。你的json将等价于'{“Foo”:...}我的示例 –

0

我不知道,但是这可能会解决您的问题。改变你的模型如下:

数据模型:

[System.Serializable] 

public class Data { 

public DataHolder dataHolder; 

} 

而且你DataHolder型号:

[System.Serializable] 

public class DataHolder { 

public string TextToPass; 

} 

希望它能帮助!

+0

不起作用,我改变了它,我得到的错误,然后我修正它们它基本上只是改变名称。 – Nanopl

0
{"DataHolder": 

    { 
     "TextToPass":"I'm A Horse" 
    } 
} 

这是你的JSON数据,它应该转换为C#为:

​​3210

然后使用:

if (File.Exists(filePath)) 
{ 

    string dataAsJSON = File.ReadAllText(filePath); 
    RootObject rootObject = JsonUtility.FromJson<RootObject>(dataAsJSON); 
    if(rootObject == null){ Debug.LogError("Json failed"); } 
    DataHolder dt = rootObject.dataHolder; 
    if(dt == null){ Debug.LogError("Missing object"); } 
    Debug.Log("My Text is" + dt.TextToPass); 

    Debug.Log("Path Exist"); 
} 

的问题是,你的JSON文件不具有映射C#文件和序列化程序在映射中没有匹配。

+0

但为什么我们需要rootObject? – Nanopl

+0

你的json文件是一个没有包含DataHolder对象的名字的对象。 RootObject是一个任意的命名。你实际上可以改变它。 – Everts

+0

你的意思是它不包含DataHolder对象。为什么我首先需要一个数据持有者对象?我的问题是,我真的不明白我如何需要这一切?这条线呢? DataHolder loadedData = JsonUtility.FromJson (dataAsJSON); 是创建一个数据持有者并从json中分配读数给它? – Nanopl