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

JObject json = new JObject(); 

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

似乎沒有工作?可以Json.Net處理列表<object>?

錯誤:

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

回答

37

一個JValue只能包含如字符串,整數,布爾值,日期等簡單值。它不能包含複雜的對象。我懷疑你真正想要的是這樣的:

List<User> list = LoadUsers(); 

JObject json = new JObject(); 

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

以上將User對象列表轉換成代表用戶JObjects一個JArray,然後分配到users財產上的新JObject。您可以通過檢查json["users"]Type屬性並確認它是Array來確認。

相反,如果您按照此問題的另一個答案(現已刪除)中所建議的那樣執行json["users"] = new JValue(JsonConvert.SerializeObject(list)),則您可能無法獲得所需的結果。該方法會將用戶列表序列化爲字符串,從中創建一個簡單的JValue,然後將JValue分配給JObject上的users屬性。如果您檢查json["users"]Type財產,您會看到它是String。這意味着,如果您稍後嘗試使用json.ToString()JObject轉換爲JSON,則將獲得雙重序列化的輸出,而不是您可能期望的JSON。

這裏是一個簡短的演示來說明的區別:

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

輸出:

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

爲我工作!謝謝 – s0nica 2014-01-24 10:33:22

0

我有這個問題,你現在可以使用JArray得到這個工作,如果你只是想沒有根名稱的數組項目。

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

如果你想JSON數組的根名稱爲「用戶」,您可以使用

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