Json.Net可以处理List <object>吗?</object>

时间:2009-07-30 17:17:12

标签: c# asp.net json json.net

List<User> list = LoadUsers();

JObject json = new JObject();

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

似乎没有用?

错误:

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

2 个答案:

答案 0 :(得分:51)

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

List<User> list = LoadUsers();

JObject json = new JObject();

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

以上内容会将User个对象列表转换为代表用户的JArrayJObjects,然后将其分配给新{{1}上的users属性}}。您可以通过检查JObject的{​​{1}}属性来确认这一点,并确认它是Type

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

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

String

输出:

JObject

答案 1 :(得分:3)

我有这个问题,你现在可以使用JArray完成这项工作,如果你只是想要没有根名称的数组项。

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

如果您希望json数组的根名称为“users”,则可以使用

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