2011-01-12 16 views
10

Existe una API que no controlo, pero cuya salida debo consumir con C#, preferiblemente usando JSON.Net.Deserialización de las respuestas JSON que contienen atributos que entran en conflicto con las palabras clave

He aquí un ejemplo de respuesta:

[ 
    { 
     "media_id": 36867, 
     "explicit": 0 
    } 
] 

que había planeado para tener una clase de esta manera:

class Media { 
    public int media_id; 
    public int explicit; 
} 

Y deserializar:

var l = JsonConvert.DeserializeObject<List<Media>>(s); 

Por desgracia, "explícito" es una palabra clave C#, por lo que no se puede compilar.

Mi siguiente conjetura es modificar la clase:

class Media { 
    public int media_id; 
    public int explicit_; 
} 

... y de alguna manera mapear los atributos de respuesta a los atributos de C#.

¿Cómo debo hacer eso, o estoy yendo totalmente de esta manera?

De lo contrario, estaría bien simplemente ignorar el "explícito" en la respuesta, si hay una manera de hacerlo?

Respuesta

17

no ha utilizado JSON.Net, pero a juzgar por los documentos here, supongo que sólo tiene que hacer lo que haría con XmlSerialization: Añadir un atributo a decir cómo la propiedad JSON debe ser llamado:

class Media { 
    [JsonProperty("media_id")] 
    public int MediaId; 
    [JsonProperty("explicit")] 
    public int Explicit; 
} 
+0

Saludos, me salté eso porque el ToC dijo "serialización" cuando quería la deserialización. Gracias por el puntero. –

10

C# permite definir los miembros con nombres de las palabras reservadas para los casos de interoperabilidad (exactamente como éste) al escapar con el signo @, por ejemplo,

class Media { 
    public int media_id; 
    public int @explicit; 
} 
No

seguro de cómo funciona este sistema con JSON.Net, pero lo haría imagine que debería funcionar (ya que el @ es un escape y no es parte del nombre del campo).

+0

entiendo lo que estás diciendo, pero ¿Puede proporcionar un enlace a una explicación más detallada? Intenté este cambio w/that: "var x = new Media(); x.explicit = true;" No compilaría, pero "x. @ Explicit = true" sí lo hizo. –

+0

En su código, usaría "@explicit". Pero esto se compila con un nombre real de "explícito" en el binario. Entonces, el código de serialización/deserialización de JSON.Net sería "explícito", no "@explicit". Al igual que cuando usas "\ n" en tu código, pero se compila en un salto de línea en el binario. –

+0

Ya veo, gracias. Todavía aceptó la respuesta JsonProperty, ya que es específica de este dominio y maneja casos más generales también. –

1

El siguiente código funcionó para mí.

class JsonRpc { 
    public string id; 
    public string method; 
    public string[] @params; 
} 
JsonConvert.DeserializeObject<JsonRpc> (data) 

Gracias a todos

Cuestiones relacionadas