2009-07-30 7 views

Odpowiedz

37

JValue może zawierać tylko proste wartości, takich jak ciągi, wskazówki, logicznych, dat i tym podobne. Nie może zawierać złożonego obiektu. Podejrzewam, że to, co naprawdę chcesz to:

List<User> list = LoadUsers(); 

JObject json = new JObject(); 

json["users"] = JToken.FromObject(list); 

Powyższy przekonwertuje listę User obiektów w JArray z JObjects reprezentujący użytkowników, a następnie przypisać, że do właściwości users na nowym JObject. Możesz to potwierdzić, sprawdzając właściwość Type pod numerem json["users"] i sprawdź, czy jest to Array.

W przeciwieństwie do tego, jeśli zrobisz json["users"] = new JValue(JsonConvert.SerializeObject(list)), jak zasugerowano w innej odpowiedzi na to pytanie (teraz usunięte), prawdopodobnie nie uzyskasz oczekiwanego wyniku. To podejście spowoduje przekształcenie listy użytkowników w ciąg znaków, utworzenie prostej odmiany JValue, a następnie przypisanie wartości JValue do właściwości users w urządzeniu JObject. Jeśli przejrzysz właściwość Type z json["users"], zobaczysz, że jest to String. Oznacza to, że jeśli później spróbujesz przekonwertować JObject na JSON, używając json.ToString(), otrzymasz wynik podwójnie serializowany zamiast JSON, którego prawdopodobnie oczekujesz.

Oto krótkie demo, aby zilustrować różnicę:

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; } 
    } 
} 

wyjściowa:

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

pracował dla mnie! Dzięki – s0nica

+0

Dzięki. Właśnie to spędziłem cały dzień próbując dojść do tego. – Trebor

+0

doskonały, dlaczego nie jest to oznaczone jako odpowiedź? – killernerd

0

miałem ten problem, można użyć JArray, aby to zrobić, jeśli tylko chcesz elementy tablicy bez nazwy root.

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

Jeśli chcesz nazwę użytkownika root tablicy json być „użytkowników”, można użyć

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