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));
Unityの「JsonUtility」は**辞書**をサポートしていません。 – Programmer
@Programmerので、私は 'ISerializationCallbackReceiver'を使用しようとしていました。ここでは他のデータ構造が適切でしょうか? – hotshotiguana
申し訳ありません。本当にこれで助けることはできません。おそらく、辞書をサポートする有償のJsonプラグインを使うべきでしょう。それは私の推薦です。 – Programmer