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/"}]"
}