2012-05-11 11 views
6

Estoy usando C# .NET 4.0 para analizar un JSON en un objeto personalizado. Estoy usando JavaScriptSerializer.Deserialize para asignarlo a una clase que escribí. El problema es, los pares de nombre/valor del JSON no son estáticas y varían en función del argumento isChain, como se ve en este fragmento JSON (mejor enlace en la parte inferior):Deserialización de un JSON con pares de nombre/valor de variable en el objeto en 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" 
    } 
} 

Las cadenas pueden tener cualquier lugar de _STATE_0 a _STATE_25 entradas en las cadenas ¿Hay alguna manera de almacenar estos datos, así que no tengo que escribir 12 * 26 clases vacías, así:

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; } 

¿Hay una biblioteca o alguna otra forma que podría utilizar para analizar parcialmente única la STATE_0 , STATE_1, etc. campos? ¿Podría sugerir una forma de agregar estos pares JSON recientemente agregados?

Editado para aclarar: Para tener una idea de lo que estoy trabajando con, aquí está la clase derivada de los JSONs:

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

Básicamente, sólo necesito una manera de almacenar estas cadenas implementadas recientemente en esta clase de alguna manera para el procesamiento. Todas esas clases/propiedades se generan a partir de estos JSON.

+7

"Prefiero no usar recursividad, libs de terceros o deserializar en var/dynamic." buena suerte para encontrar una solución dentro de esos límites –

+1

Podrías hacer esto fácilmente con [Json.NET] (http://json.codeplex.com/) – casperOne

+0

@casperOne +1, pero haría una sugerencia de usando [fastJSON] (http://www.codeproject.com/Articles/159450/fastJSON) sobre eso. Json.NET es muy lento y grande y puede ser difícil realizar modificaciones debido a su complejidad. – erodewald

Respuesta

2

Uso Newtonsoft Json.NET y como ejemplo de código siguiente

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"" 
    } 
}"; 

y una línea de código para deserializar al diccionario:

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

después de que pueda acceder a valores simples de clave de diccionario:

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

El problema es que mi JSON contiene todo tipo de otras entradas de varios niveles: revisa mi edición para aclarar. ¿Json.NET admite algún tipo de condicional o subdeserialización? Quisiera +1 si pudiera, ya que respondió la pregunta en el contexto que proporcioné. Mi culpa por no ser lo suficientemente clara. – br4d

+1

Json.NET resuelve su problema. Puede deserializar no como un objeto mecanografiado como lo he hecho en la muestra. Hay muchos métodos y sobrecargas allí. Por lo tanto, puede usar uno de ellos para producir, por ejemplo, Dictionary o o un objeto interno de Json.NET, luego puede deserializar el nodo de árbol por nodo. Si va a haber problemas con eso, acabo de dejar aquí el comentario – Regfor

+0

Su solución junto con TypeBuilder/Reflection han resuelto mi problema. Muchas gracias. – br4d

Cuestiones relacionadas