una serialize serializar recorrer objeto newtonsoft leer deserialize deserializar como cadena c# windows-phone-7 json.net hammock

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



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