2012-05-11 6 views
6

Ich verwende C# .NET 4.0, um ein JSON in ein benutzerdefiniertes Objekt zu analysieren. Ich verwende JavaScriptSerializer.Deserialize, um es einer von mir geschriebenen Klasse zuzuordnen. Das Problem ist, die Name/Wert-Paare der JSON sind nicht statisch, und variieren je nach dem Argument isChain, wie in diesem JSON Fragment (bessere Verbindung unten) gesehen:Deserialisieren eines JSON mit Variablen Name/Wert-Paaren in Objekt in C#

{ 
    "STATE_WALK_LEFT":{ 
     "isChain":"1", 
     "x":"1" 
    }, 
    "STATE_WALK_LEFT_0":{ 
     "x":"0" 
    }, 
    "STATE_WALK_LEFT_1":{ 
     "x":"40" 
    }, 
    "STATE_WALK_LEFT_2":{ 
     "x":"80" 
    }, 
    "STATE_WALK_RIGHT":{ 
     "isChain":"0" 
    }, 
    "STATE_RUN_LEFT":{ 
     "isChain":"0" 
    } 
} 

Die Ketten können überall von _STATE_0 zu _STATE_25 Einträge haben in den Ketten. Gibt es eine Möglichkeit, diese Daten zu speichern, so dass ich Klassen schreiben muß nicht 12 * 26 leer wie so:

public StateWalkLeft0 STATE_WALK_LEFT { get; set; } 
public StateWalkLeft0 STATE_WALK_LEFT_0 { get; set; } 
public StateWalkLeft1 STATE_WALK_LEFT_1 { get; set; } 
public StateWalkLeft2 STATE_WALK_LEFT_2 { get; set; } 
public StateWalkLeft3 STATE_WALK_LEFT_3 { get; set; } 

Gibt es eine Bibliothek oder eine andere Weise, die ich teilweise nur zu analysieren, um die STATE_0 verwenden könnte , STATE_1, usw. Felder? Können Sie vielleicht eine Möglichkeit vorschlagen, diese kürzlich hinzugefügten JSON-Paare hinzuzufügen?

Edited zu klären: Um eine Vorstellung davon zu bekommen, was mit arbeite ich, hier ist die Klasse von den JSONs abgeleitet:

Check out my full Class to get an idea of what the JSONs contain

Grundsätzlich Ich brauche nur eine Art und Weise zu speichern, Diese kürzlich in dieser Klasse implementierten Ketten werden irgendwie zur Verarbeitung benötigt. Alle diese Klassen/Eigenschaften werden aus diesen JSONs generiert.

+7

"Ich würde es vorziehen, keine Rekursion, 3rd-Party-Bibliotheken oder Deserialisierung in var/dynamic zu verwenden." Viel Glück, eine Lösung innerhalb dieser Grenzen zu finden –

+1

Sie könnten dies leicht mit [Json.NET] (http://json.codeplex.com/) – casperOne

+0

@ CasperOne +1 tun, aber ich würde einen Vorschlag machen mit [fastJSON] (http://www.codeproject.com/Articles/159450/fastJSON) darüber hinaus. Json.NET ist sehr langsam und groß und kann aufgrund seiner Komplexität schwierig sein, Änderungen vorzunehmen. – erodewald

Antwort

2

Verwenden Newtonsoft Json.NET und als Beispiel folgenden Code

internal struct ChainX 
{ 
    public int x { get; set; } 
    public int isChain { get; set; } 
} 

    static string json = 
@"{ 
    ""STATE_WALK_LEFT"":{ 
     ""isChain"":""1"", 
     ""x"":""1"" 
    }, 
    ""STATE_WALK_LEFT_0"":{ 
     ""x"":""0"" 
    }, 
    ""STATE_WALK_LEFT_1"":{ 
     ""x"":""40"" 
    }, 
    ""STATE_WALK_LEFT_2"":{ 
     ""x"":""80"" 
    }, 
    ""STATE_WALK_RIGHT"":{ 
     ""isChain"":""0"" 
    }, 
    ""STATE_RUN_LEFT"":{ 
     ""isChain"":""0"" 
    } 
}"; 

und einer Codezeile Wörterbuch deserialisieren:

var values = JsonConvert.DeserializeObject<Dictionary<string, ChainX>>(json); 

nach, dass Sie einfachen Zugriff Werte von Wörterbuch-Schlüssel:

ChainX valueWalkLeft1 = values["STATE_WALK_LEFT_1"]; 
+0

Problem ist, mein JSON enthält alle Arten von anderen mehrstufigen Einträgen - siehe meine Bearbeitung zur Klärung. Unterstützt Json.NET eine Art von Conditional oder Sub-Deserializing? Ich würde Ihnen +1 geben, wenn ich könnte, da Sie die Frage in dem von mir bereitgestellten Kontext beantwortet haben. Meine Schuld, weil ich nicht klar genug war. – br4d

+1

Json.NET löst Ihr Problem. Sie können das Deserialisieren nicht als typisiertes Objekt durchführen, wie ich es in Beispiel gemacht habe. Dort gibt es viele Methoden und Überladungen. Daher können Sie eine von ihnen verwenden, um zum Beispiel Dictionary oder oder internes Json.NET-Objekt zu erzeugen, dann können Sie den Knoten Knoten für Knoten deserialisieren. Wenn es Probleme damit geben wird, nur hier Kommentar – Regfor

+0

Ihre Lösung zusammen mit TypeBuilder/Reflection haben mein Problem gelöst. Danke vielmals. – br4d

Verwandte Themen