2017-12-05 24 views
2

私はJsonの配列をUnityのオブジェクトの配列に変換しようとしています。私は2ヤードの古いスレッドから解説なしで解決策を見つけましたが、実際にどのように動作するのか不思議です。
は、私はそれが私に示してFromJsonの定義を探すためのVisual Studioを使用している場合、この
public static T FromJson<T>(string json);
私はFromJsonは、オブジェクトを充填するために、私はクラスMyWrapperを与えるが、MyWrapperを伝えるほかにそれは彼が含まれている尋ねることであることを理解したようリストQuestionリストに新しいアイテムを作成することはありません。それで実際にリストにはどのように記入されますか?JsonUtilityのラッパーの仕組み

C#

MyWrapper wrappedQuestions = JsonUtility.FromJson<MyWrapper>(jsonString); 

[Serializable] 
public class MyWrapper 
{ 
    public List<Question> questions; 
} 

[Serializable] 
public class Question 
{ 
    public int questionType; 
    public string questionString; 
    public int questionAnswer; 
} 

JSON

{ 
    "questions": [ 
     { 
     "questionType": 1, 
     "questionString": "4^2", 
     "questionAnswer": 16 
     }, 
     { 
     "questionType": 2, 
     "questionString": "√(25)", 
     "questionAnswer": 5 
     } 
    ] 
} 

私はここに、このような質問をするI'amができるよう願っていますので、私はまだ初心者プログラマです。

+0

[多分ドキュメントを読む?](https://docs.unity3d.com/ScriptReference/JsonUtility.FromJson.html)。 *それは実際にリストをどのように満たしていますか?*それはパーサです。パーサは何ですか?あなたの質問は明確ではありません – Liam

答えて

3

ユニファイドエンジニアがプリミティブ型や配列を直接サポートしていないため、ラッパーが必要な理由が不思議なら、彼らがそれをどのようにプログラムしたかだけです。ほとんどのJson APIはそうではありません。

実際にどのようにリストに入りますか?

Reflection

。あなたが渡したjsonを読み込みます。 jsonの変数questionsが検出されます。 []などの形式と、各項目を区切るカンマのために、questions変数が配列であることが検出されます。

.ITはQuestionQuestionまたは一覧であるquestions変数のタイプを見つけ。

.ITは、Questionの新しいインスタンスを作成し、JSON内の各変数からそれぞれの値を読み、それが作成した新しいインスタンスを持つ反射でそれらを埋めるためにActivator.CreateInstanceを使用しています。

。塗りつぶされた新しいインスタンスを返します。

C#でリフレクトを使って基本的な処理を行う方法を理解している場合は、Queueクラスの独自の単純なJsonパーサを作成することができます。

最後に、各クラスのラッパーを作成せずにthisアレイのシリアル化/デシリアライズの簡単な答えのJsonHelperラッパーを使用できます。

1

JSONはJavascript Object Notationの略で、JSONオブジェクト(文字列)はパターンに従います。構文解析してオブジェクトに変換する文字列は、有効なJSONでなければなりません。これはコロン:により分離(

[ ]が配列/リストは、

{ }がオブジェクトに対して

されると、すべてのオブジェクトは、キーと値のペアを含むことができ、例えば、特定のルール/構文を有する

)を使用して変数を値とともに表します。

{ "Key" : "Value" } 

JSONパーサーはこれらのルールを使用して、有効なJSONがあるかどうかを調べることができます。

JSONをクラスオブジェクトに変換するには、どのようなことが必要ですか?

クラスタイプあなたはここに提供:

JsonUtility.FromJson<MyWrapper>(jsonString); 

MyWrapperです。

jsonStringと同じ構造である必要があります。

は、クラス構造とそれをマッピングするために、あなたのjsonStringを打破するのをしてみましょう:

これはMyWrapperオブジェクトを表します。質問と呼ばれる1つのプロパティのみを含んでいます。これは空のリストです。

{     
    "questions": [ ] 
} 

questionsはそれで任意の要素を持っている場合、それは我々がJSONで、次のように書くことができますタイプQuestionで次のようになります。questionsが複数の要素を持っている場合

{ 
    "questionType": 1, // int value 
    "questionString": "4^2", // string value 
    "questionAnswer": 16 // int value 
} 

は今、彼らはによって分離されるだろうカンマ:それは文字列を解析して作成することができますクラス構造を見てて

"questions": [ 
    { 
    "questionType": 1, 
    "questionString": "4^2", 
    "questionAnswer": 16 
    }, 
    { 
    "questionType": 2, 
    "questionString": "√(25)", 
    "questionAnswer": 4 
    }, 
    ... 
] 

JSONパーサーは、これらすべてのルールを知っていますJSONが有効であり、クラス構造がJSON構造と一致していれば、指定されたクラスのオブジェクトです。

これは私がこれについて言うことができるすべてです、あなたは基本的な理解を得たことを願っています。