Un JValue
ne peut contenir que des valeurs simples comme des chaînes, ints, booléens, dates et autres. Il ne peut pas contenir d'objet complexe. Je soupçonne ce que vous voulez vraiment est la suivante:
List<User> list = LoadUsers();
JObject json = new JObject();
json["users"] = JToken.FromObject(list);
ci-dessus convertira la liste des objets User
dans un JArray
de JObjects
représentant les utilisateurs, puis attribuez-lui que la propriété users
sur la nouvelle JObject
. Vous pouvez le confirmer en examinant la propriété Type
de json["users"]
et voir que c'est Array
. Par contre, si vous faites json["users"] = new JValue(JsonConvert.SerializeObject(list))
comme cela a été suggéré dans une autre réponse à cette question (maintenant supprimée), vous n'obtiendrez probablement pas le résultat que vous recherchez. Cette approche va sérialiser la liste des utilisateurs à une chaîne, créer un JValue
simple à partir de cela, puis affecter le JValue
à la propriété users
sur le JObject
. Si vous examinez la propriété Type
de json["users"]
, vous verrez que c'est String
. Qu'est-ce que cela signifie, si vous essayez plus tard de convertir le JObject
en JSON en utilisant json.ToString()
, vous obtiendrez une sortie en double série au lieu du JSON que vous attendez probablement.
Voici une courte démo pour illustrer la différence:
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; }
}
}
Sortie:
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\"}]"
}
a marché pour moi! Merci – s0nica
Merci. C'était exactement ce que j'ai passé toute la journée à essayer de comprendre. – Trebor
parfait, pourquoi n'est-ce pas marqué comme la réponse? – killernerd