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