serialize - serializar y deserializar json c#
Deserializar una matriz JSON en un objeto.NET fuertemente tipado (7)
Después de mirar la fuente , para WP7 Hammock en realidad no usa Json.Net para el análisis JSON. En su lugar, utiliza su propio analizador que no se adapta muy bien a los tipos personalizados.
Si usa Json.Net directamente, es posible deserializar una colección fuertemente tipada dentro de un objeto contenedor.
var response = @"
{
""data"": [
{
""name"": ""A Jones"",
""id"": ""500015763""
},
{
""name"": ""B Smith"",
""id"": ""504986213""
},
{
""name"": ""C Brown"",
""id"": ""509034361""
}
]
}
";
var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass));
return des.data.Count.ToString();
y con:
public class MyClass
{
public List<User> data { get; set; }
}
public class User
{
public string name { get; set; }
public string id { get; set; }
}
Tener que crear el objeto adicional con la propiedad de datos es molesto, pero eso es una consecuencia de la forma en que se construye el objeto formateado JSON.
Documentación: Serialización y deserialización de JSON
Cuando puedo llamar a la API de terceros y obtener una sola clase de datos, todo se deserializa utilizando este código
TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser
El problema surge cuando intento deserializar el contenido de respuesta JSON que es una matriz, como
{
"data": [
{
"name": "A Jones",
"id": "500015763"
},
{
"name": "B Smith",
"id": "504986213"
},
{
"name": "C Brown",
"id": "509034361"
}
]
}
Solo puedo hacer que la serialización funcione si utilizo una clase de ajuste personalizada alrededor del miembro "datos" y ese miembro debe ser del tipo List<object>
. Si los tiene como tipo List<TheUser>
obtengo ArgumentException
del método JsonParser DesializeType
.
Originalmente intenté serializar sin un tipo de envoltura como este
List<TheUser> freinds = jsonSerializer.Deserialize(response, typeof(List<TheUser>)) as List<TheUser>;
pero eso solo me devuelve una colección vacía. Seguramente debo ser capaz de hacer que la matriz se deserialice a una lista fuertemente tipada.
Esta solución parece funcionar para mí y consigue tener que codificar un montón de clases con "Datos" en ellas.
public interface IDataResponse<T> where T : class
{
List<T> Data { get; set; }
}
public class DataResponse<T> : IDataResponse<T> where T : class
{
[JsonProperty("data")]
public List<T> Data { get; set; }
}
Debería haber incluido esto para comenzar, aquí hay un método de ejemplo usando lo anterior:
public List<TheUser> GetUser()
{
var results = GetUserJson();
var userList = JsonConvert.DeserializeObject<DataResponse<TheUser>>(results.ToString());
return userList.Data.ToList();
}
Esto funcionó para mí para deserializar JSON en una matriz de objetos:
List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response);
Json.NET - Documentación
http://james.newtonking.com/json/help/index.html?topic=html/SelectToken.htm
Interpretación para el autor
var o = JObject.Parse(response);
var a = o.SelectToken("data").Select(jt => jt.ToObject<TheUser>()).ToList();
Pat, la estructura json parece muy familiar para un problema que describí here . La respuesta para mí fue tratar la representación json como un Diccionario <TKey, TValue>, aunque solo había 1 entrada.
Si estoy en lo correcto, tu clave es de tipo cadena y el valor de una Lista <T> donde T representa la clase ''El Usuario''
HTH
PD: si quieres una mejor serialización, perf check out usando Silverlight Serializer , necesitarás construir una versión WP7, plug Shameless - escribí una publicación en el blog sobre this
Sospecho que el problema se debe a que json representa un objeto con la lista de usuarios como una propiedad. Intenta deserializar a algo como:
public class UsersResponse
{
public List<User> Data { get; set; }
}
tratar
List<TheUser> friends = jsonSerializer.Deserialize<List<TheUser>>(response);