2017-04-03 89 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