2017-02-08 5 views
3

Der REST-Dienst, den ich benutze RSA Archer, erwartet einen Integer-Schlüssel, was bedeutet, ich kann [Serializable] Objekte einfach verschachteln und dann JsonUtility.ToJson(), um die serialisierte JSON-Zeichenfolge zu erstellen. Ich dachte, ich fand eine Lösung, um ein Dictionary Objekt zu erstellen und dann ISerializationCallbackReceiver zu verwenden, um nur das Wörterbuch Stück der verschachtelten Struktur zu behandeln, aber der folgende Code ignoriert einfach den Teil des verschachtelten Objekts und serialisiert das Dictionary nicht. Hat jemand irgendwelche Gedanken über den besten Ansatz dazu?Unity Serialisierung geschachtelte Dictionary zu JSON

Erwartete Ausgabe:

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

Objektstruktur:

[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 und Instanziierung:

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's 'JsonUtility' unterstützt ** nicht **. – Programmer

+0

@Programmierer deshalb habe ich versucht, 'ISerializationCallbackReceiver' zu verwenden. Wäre hier eine andere Datenstruktur sinnvoller? – hotshotiguana

+0

Entschuldigung. Wirklich kann hier nicht helfen. Sie sollten wahrscheinlich ein kostenpflichtiges Json-Plugin verwenden, das Dictionary unterstützt. Das ist meine Empfehlung in Ihrem Fall. – Programmer

Antwort

0

JsonUtility ist der schnellste Weg jsons zu verwenden, da es nicht fast nicht erzeugt jeder GC. Das Problem ist, dass es nicht sehr flexibel ist, weil Sie die Datenstruktur im Voraus wissen müssen und es nicht mutiert werden kann, da es eine Klasse benötigt.

Wenn Sie Jsons als Wörterbücher verwenden möchten, können Sie entweder MiniJSON verwenden (nur rechts klicken und Speichern unter ...) oder JSONObject, beide sind kostenlos und arbeiten in jeder Plattform altough sie viel langsamer als JsonUtilty sind, so dass, wenn Sie analysieren große jsons oder müssen es oft tun, während die Leistung zählt, dann wird es nicht flüssig sein.

Ich persönlich habe beide verwendet und sie sind großartig, MiniJSON ist ein bisschen einfacher zu verwenden, während JSONObject ein bisschen stärker ist, aber auch ein bisschen schwieriger zu beginnen.

EDIT:

Wie in einer der Kommentare erwähnt auch Newtonsoft verwenden können, ich denke, es ist schneller als minijson und JSONObject aber vielleicht zu viel des Guten, wenn Sie nicht eine Menge Sachen mit jsons tun.

+0

Dank @Juan. Ich bin sicherlich nicht gegen Bibliotheken von Drittanbietern, aber als ich LitJSON benutzte, um dies zu tun, stieß ich auf viele Probleme, es mit den Hololens zu arbeiten, daher der Fallback zu JsonUtility. Ich werde diese anderen Bibliotheken testen und sehen, wie sie funktionieren. – hotshotiguana

+0

Ich empfehle dir minijson, wenn du keine großen jsons parsen musst, es ist nur ein Skript und es ist super einfach zu benutzen. Google und Facebook verwenden es in ihren SDKs für die Einheit –