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
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
一個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\"}]"
}
我有這個問題,你現在可以使用JArray得到這個工作,如果你只是想沒有根名稱的數組項目。
var json = JArray.FromObject(LoadUsers());
如果你想JSON數組的根名稱爲「用戶」,您可以使用
var json = new JObject { ["users"] = JToken.FromObject(LoadUsers()) };
爲我工作!謝謝 – s0nica 2014-01-24 10:33:22