2009-07-30 11 views

Répondre

37

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\"}]" 
} 
+1

a marché pour moi! Merci – s0nica

+0

Merci. C'était exactement ce que j'ai passé toute la journée à essayer de comprendre. – Trebor

+0

parfait, pourquoi n'est-ce pas marqué comme la réponse? – killernerd

0

j'ai eu ce problème, vous pouvez maintenant utiliser jarray pour obtenir ce fait, si vous voulez juste la éléments de tableau sans nom racine.

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

Si vous voulez que le nom racine du tableau JSON être « utilisateurs », vous pouvez utiliser

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