serialize serializar objects newtonsoft net example deserialize c# asp.net json json.net

objects - serializar json c#



¿Puede Json.Net manejar un<objeto> de lista? (2)

List<User> list = LoadUsers(); JObject json = new JObject(); json["users"] = new JValue(list);

¿No parece estar funcionando?

Error:

Could not determine JSON object type for type System.Collections.Generic.List`1


Tuve este problema, ahora puedes usar JArray para hacer esto, si solo quieres los elementos de la matriz sin nombre raíz.

var json = JArray.FromObject(LoadUsers());

Si desea que el nombre raíz de la matriz json sea "usuarios", puede usar

var json = new JObject { ["users"] = JToken.FromObject(LoadUsers()) };


Un JValue solo puede contener valores simples como cadenas, ints, booleanos, fechas y similares. No puede contener un objeto complejo. Sospecho que lo que realmente quieres es esto:

List<User> list = LoadUsers(); JObject json = new JObject(); json["users"] = JToken.FromObject(list);

Lo anterior convertirá la lista de objetos de User en una JArray de JObjects representa a los usuarios, luego la asignará a la propiedad de los users en el nuevo JObject . Puedes confirmar esto examinando la propiedad Type de json["users"] y verás que se trata de Array .

En contraste, si hace json["users"] = new JValue(JsonConvert.SerializeObject(list)) como se sugirió en otra respuesta a esta pregunta (ahora eliminada), probablemente no obtendrá el resultado que está buscando. Ese enfoque serializará la lista de usuarios en una cadena, creará un JValue simple a JValue de eso, y luego asignará el JValue a la propiedad de los users en el objeto JObject . Si examina la propiedad Type de json["users"] , verá que es String . Lo que esto significa es que, si luego intenta convertir el objeto JObject a JSON utilizando json.ToString() , obtendrá una salida de doble serialización en lugar del JSON que probablemente espera.

Aquí hay una breve demostración para ilustrar la diferencia:

class Program { static void Main(string[] args) { List<User> list = new List<User> { new User { Id = 1, Username = "john.smith" }, new User { Id = 5, Username = "steve.martin" } }; JObject json = new JObject(); json["users"] = JToken.FromObject(list); Console.WriteLine("First approach (" + json["users"].Type + "):"); Console.WriteLine(); Console.WriteLine(json.ToString(Formatting.Indented)); Console.WriteLine(); Console.WriteLine(new string(''-'', 30)); Console.WriteLine(); json["users"] = new JValue(JsonConvert.SerializeObject(list)); Console.WriteLine("Second approach (" + json["users"].Type + "):"); Console.WriteLine(); Console.WriteLine(json.ToString(Formatting.Indented)); } class User { public int Id { get; set; } public string Username { get; set; } } }

Salida:

First approach (Array): { "users": [ { "Id": 1, "Username": "john.smith" }, { "Id": 5, "Username": "steve.martin" } ] } ------------------------------ Second approach (String): { "users": "[{/"Id/":1,/"Username/":/"john.smith/"},{/"Id/":5,/"Username/":/"steve.martin/"}]" }