Json.Net可以处理List 吗?

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

似乎不起作用?

错误:

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

JValue只能包含简单的值,如字符串,整数,布尔值,日期等。 它不能包含复杂的对象。 我怀疑你真正想要的是这个:

 List list = LoadUsers(); JObject json = new JObject(); json["users"] = JToken.FromObject(list); 

上面将把User对象列表转换为表示UserJArrayJObjects ,然后将其分配给新JObject上的users属性。 您可以通过检查json["users"]Type属性来确认这一点,并看到它是Array

相反,如果您按照此问题的另一个答案(现已删除)中的建议执行json["users"] = new JValue(JsonConvert.SerializeObject(list)) ),您可能无法获得所需的结果。 该方法将用户列表序列化为字符串, JValue创建一个简单的JValue ,然后将JValue分配给JValue上的users属性。 如果检查json["users"]Type属性,您将看到它是String 。 这意味着,如果您稍后尝试使用json.ToString()JObject转换为JSON,您将获得双序列化输出而不是您可能期望的JSON。

这是一个简短的演示来说明差异:

 class Program { static void Main(string[] args) { List list = new List { 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数组的根名称为“users”,则可以使用

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