2017-02-08 11 views
3

RSA Archerが使用しているRESTサービスでは、整数キーが必要です。つまり、[Serializable]オブジェクトをネストできず、次にJsonUtility.ToJson()をシリアリングできません。 Dictionaryオブジェクトを作成し、ISerializationCallbackReceiverを使用して入れ子構造の辞書部分だけを処理するソリューションを見つけたと考えましたが、以下のコードは入れ子オブジェクトのその部分を無視し、Dictionaryをシリアル化しません。誰もがこれに最善のアプローチについての考えを持っていますか?UnityのネストされたディクショナリをJSONにシリアライズ

予想される出力:

{"Content": {"LevelId": 10,"FieldContents": {"47": {"Type": 1, "Value": "me", "FieldId": 47}}}} 

オブジェクト構造:

[Serializable] 
public class Record 
{ 
    public Content Content; 
} 

[Serializable] 
public class Content 
{ 
    public int LevelId; 
    public FieldContents FieldContents; 
} 

public class FieldContents : ISerializationCallbackReceiver 
{ 
    public Dictionary<string, FieldValue> FieldValues; 

    public List<string> dicKeys; 
    public List<FieldValue> dicVals; 

    public void OnBeforeSerialize() 
    { 
     dicKeys.Clear(); 
     dicVals.Clear(); 
     foreach (var kvp in FieldValues) { 
      dicKeys.Add (kvp.Key); 
      dicVals.Add (kvp.Value); 
     } 
    } 

    public void OnAfterDeserialize() 
    { 
     FieldValues = new Dictionary<string, FieldValue>(); 
     for (int i = 0; i < Math.Min (dicKeys.Count, dicVals.Count); i++) { 
      FieldValues.Add (dicKeys [i], dicVals [i]); 
     } 
    } 
} 

[Serializable] 
public class FieldValue 
{ 
    public int Type; 
    public string Value; 
    public int FieldId; 
} 

JSONUtilityとインスタンス化:

Record newRecord = new Record() { Content = new Content() { 
       LevelId = 10, 
       FieldContents = new FieldContents() { FieldValues = new Dictionary<string, FieldValue>() { { 
          "47", 
          new FieldValue() { 
           Type = 1, 
           Value = "me", 
           FieldId = 47 
          } 
         } 
        } 
       } 
      } 
     }; 
Debug.Log (JsonUtility.ToJson (newRecord)); 
+1

Unityの「JsonUtility」は**辞書**をサポートしていません。 – Programmer

+0

@Programmerので、私は 'ISerializationCallbackReceiver'を使用しようとしていました。ここでは他のデータ構造が適切でしょうか? – hotshotiguana

+0

申し訳ありません。本当にこれで助けることはできません。おそらく、辞書をサポートする有償のJsonプラグインを使うべきでしょう。それは私の推薦です。 – Programmer

答えて

0

JsonUtilityはそれがほとんど発生しないようjsonsを使用するための最速の方法です任意のGC。問題は、データ構造を事前に知る必要があり、クラスが必要になると突然変異させることができないため、あまり柔軟性がないということです。

あなたが使用できる辞書MiniJSON(ちょうどclicクリックし、名前を付けて保存...)またはJSONObjectのいずれかとしJsonsを使用する必要がある場合、彼らはJsonUtiltyよりたくさん遅いaltoughので、もし両方が、すべてのプラットフォームに無料で仕事していますパフォーマンスが重要な間に大きなジャソンを解析したり、それを何度もやる必要がある場合、それは流動的ではありません。

私は個人的に両方を使用していて、彼らは素晴らしいですが、MiniJSONは少し使いやすく、JSONObjectはもう少し強力ですが、少し難しいです。

EDIT:

あなたもNewtonsoftを使用することができ、コメントの1で述べたように、私はそれがminijsonとjsonobjectよりも高速であると思いますが、あなたがjsonsで多くのものをやっていない場合はやり過ぎかもしれません。

+0

ありがとう@元。しかし、それを統一にインポートするために少し面倒。私は確かに第三者図書館に反対していませんが、これを行うためにLitJSONを使用したとき、私はHololensと連携するために多くの問題に遭遇しました。したがって、JsonUtilityへの後戻りです。私はそれらの他の図書館を試して、彼らがどのようにしているか見る。 – hotshotiguana

+0

私はbigjsonsを解析する必要がなければminijsonをお勧めします、それは唯一のスクリプトであり、使い方が簡単です。 GoogleとFacebookは統合のために彼らのsdksでそれを使用しています –

関連する問題