2017-04-03 20 views
1

jsonファイルからstringを読み込み、UnityのUIに渡そうとしています。私が直面している問題は、文字列が常にnullで、私はJSONファイルのパスを見つけてそれを読んでいますが、文字列にアクセスしようとするとnullです。私はjsonを読む方法がわかりません。私は本当にこのすべての仕組みが分からない。私はJSON形式が新しく、私はそれを練習しようとしています。これが私の最初のアプローチです。私はユニティエンジンを使用している、と私は、JSONスクリプトからストリーミング資産Unity:JSONファイルから文字列を読み取ることができません

データの読み取りを使用してJSONファイルを読んでいる:私のUIテキスト

DataController = FindObjectOfType<ReadFromJson>(); 

    _data = DataController.getCurrentRoundData(); 


    myText.text = _data.TextToPass; 
に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!!"); 
    } 

} 

} 

マネージャー

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であるが、モデルがDataを持って

+0

DataHolderモデルを共有できますか? – mindOfAi

+0

はいアップデートの質問を確認してください – Nanopl

+2

あなたの質問にはそれほど多くのものが欠けています。あなたは読んでいるjsonファイルを投稿する必要があります。 'File.Exists'がtrueを返しますか? 'TextToPass'とは何ですか? Unityのここでのjsonの読み方を見ることができます(https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity/36244111#36244111)。 GameDataをJsonで保存したいようです。私はそのためのヘルパークラスを作った[ここ](http://stackoverflow.com/a/40966346/3785314)。 – Programmer

答えて

1

nullの場合、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

関連する問題