Solución:
Puede usar el C # dynamic
escriba para facilitar las cosas. Esta técnica también simplifica la refactorización, ya que no se basa en cuerdas mágicas.
JSON
La cadena JSON a continuación es una respuesta simple de una llamada a la API HTTP y define dos propiedades: Id
y Name
.
{"Id": 1, "Name": "biofractal"}
C#
Usar JsonConvert.DeserializeObject<dynamic>()
para deserializar esta cadena en un tipo dinámico, simplemente acceda a sus propiedades de la forma habitual.
dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;
Si especifica el tipo de results
variable como dynamic
, en lugar de usar el var
palabra clave, entonces los valores de propiedad se deserializarán correctamente, por ejemplo Id
a una int
y no un JValue
(gracias a GFoley83 por el comentario a continuación).
Nota: El enlace NuGet para el ensamblado de Newtonsoft es http://nuget.org/packages/newtonsoft.json.
Paquete: También puede agregar el paquete con el instalador en vivo de nuget, con su proyecto abierto, simplemente busque el paquete y luego instálelo, instale, desinstale, actualice, simplemente se agregará a su proyecto en Dependencias / NuGet
Si solo necesita obtener algunos elementos del objeto JSON, usaría LINQ to JSON de Json.NET JObject
clase. Por ejemplo:
JToken token = JObject.Parse(stringFullOfJson);
int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");
Me gusta este enfoque porque no es necesario deserializar completamente el objeto JSON. Esto es útil con las API que a veces pueden sorprenderle con propiedades de objetos faltantes, como Twitter.
Documentación: Serializar y deserializar JSON con Json.NET y LINQ a JSON con Json.NET
Con el dynamic
palabra clave, resulta muy fácil analizar cualquier objeto de este tipo:
dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
var page = x.page;
var total_pages = x.total_pages
var albums = x.albums;
foreach(var album in albums)
{
var albumName = album.name;
// Access album data;
}