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
对象列表转换为表示User
的JArray
的JObjects
,然后将其分配给新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()) };