2009-07-30 19 views
12
List<User> list = LoadUsers(); 

JObject json = new JObject(); 

json["users"] = new JValue(list); 

Çalışmıyor gibi görünmüyor mu?Can Json.Net bir Listeyi yönetebilir <object>?

Hata:

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

cevap

37

A JValue sadece dizeleri, ints, Boolean, tarihleri ​​ve benzeri gibi basit değer içerebilir. Karmaşık bir nesne içeremez.

List<User> list = LoadUsers(); 

JObject json = new JObject(); 

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

yukarıda, kullanıcılarını temsil eden JObjects bir JArray içine User nesnelerin listesini dönüştürür ardından yeni JObject üzerinde users özelliğine o atayın: Ben gerçekten bulmak istediğiniz bu şüpheli. Bunu json["users"]'un Type özelliğini inceleyerek onaylayabilirsiniz ve bunun Array olduğunu görün. Buna karşılık, başka bir yanıtta (şimdi silindi) önerildiği gibi json["users"] = new JValue(JsonConvert.SerializeObject(list)) yaparsanız, muhtemelen aradığınız sonucu alamazsınız. Bu yaklaşım, kullanıcıların listesini bir dizgeye serileştirecek, bundan basit bir JValue oluşturacak ve JValue, JObject üzerindeki users özelliğine atayacaktır. json["users"]'un Type özelliğini incelerseniz, bunun String olduğunu görürsünüz. Bunun anlamı, daha sonra JObject'u json.ToString() kullanarak JSON'a dönüştürmeyi denerseniz, muhtemelen beklediğiniz JSON yerine çift serileştirilmiş çıktı alırsınız. İşte

farkı göstermek için kısa bir demo:

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

Çıktı:

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

çalıştı kullanabilirsiniz! Teşekkürler – s0nica

+0

Teşekkürler. Tüm günümü anlamaya çalışırken harcadığım şey buydu. – Trebor

+0

mükemmel, neden bu cevap olarak işaretlenmiyor? – killernerd

0

vardı bu sorun, artık sadece istiyorsanız bu halletmek için JArray kullanabilirsiniz kök adı olmayan dizi öğeleri. Eğer "kullanıcılar" olarak json dizinin kök adını isterseniz

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

, benim için

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