c# json.net

c# - Deserializar matriz de objetos JSON con Json.net



(3)

Con la respuesta aceptada, debe acceder a cada registro utilizando Customers[i].customer , y necesita una clase CustomerJson adicional, que es un poco molesto. Si no quiere hacer eso, puede usar lo siguiente:

public class CustomerList { [JsonConverter(typeof(MyListConverter))] public List<Customer> customer { get; set; } }

Tenga en cuenta que estoy usando una List<> , no una matriz. Ahora crea la siguiente clase:

class MyListConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { System.Diagnostics.Trace.Assert(objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>)), "CrazyList has to be a List<>"); var token = JToken.Load(reader); var list = Activator.CreateInstance(objectType) as System.Collections.IList; var itemType = objectType.GenericTypeArguments[0]; foreach (var child in token.Values()) { var childToken = child.Children().First(); var newObject = Activator.CreateInstance(itemType); serializer.Populate(childToken.CreateReader(), newObject); list.Add(newObject); } return list; } public override bool CanConvert(Type objectType) => true; public override bool CanWrite => false; public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException(); }

Intento usar una API que use la siguiente estructura de ejemplo para su json devuelto

[ { "customer":{ "first_name":"Test", "last_name":"Account", "email":"[email protected]", "organization":"", "reference":null, "id":3545134, "created_at":"2013-08-06T15:51:15-04:00", "updated_at":"2013-08-06T15:51:15-04:00", "address":"", "address_2":"", "city":"", "state":"", "zip":"", "country":"", "phone":"" } }, { "customer":{ "first_name":"Test", "last_name":"Account2", "email":"[email protected]", "organization":"", "reference":null, "id":3570462, "created_at":"2013-08-12T11:54:58-04:00", "updated_at":"2013-08-12T11:54:58-04:00", "address":"", "address_2":"", "city":"", "state":"", "zip":"", "country":"", "phone":"" } } ]

JSON.net funcionaría muy bien con algo así como la siguiente estructura

{ "customer": { ["field1" : "value", etc...], ["field1" : "value", etc...], } }

Pero no puedo encontrar la forma de hacerlo feliz con la estructura proporcionada.

El uso del JsonConvert.DeserializeObject (contenido) predeterminado da como resultado el número correcto de Cliente, pero todos los datos son nulos.

Al hacer algo, una Lista de clientes (a continuación) genera una excepción "No se puede deserializar la matriz JSON actual"

public class CustomerList { public List<Customer> customer { get; set; } }

¿Pensamientos?


Para aquellos que no desean crear ningún modelo, use el siguiente código:

var result = JsonConvert.DeserializeObject< List<Dictionary<string, Dictionary<string, string>>>>(content);


Puede crear un nuevo modelo para deserializar su Json CustomerJson :

public class CustomerJson { [JsonProperty("customer")] public Customer Customer { get; set; } } public class Customer { [JsonProperty("first_name")] public string Firstname { get; set; } [JsonProperty("last_name")] public string Lastname { get; set; } ... }

Y puedes deserializar tu json fácilmente:

JsonConvert.DeserializeObject<List<CustomerJson>>(json);

Espero eso ayude !

Documentación: Serialización y deserialización de JSON