AJValue
只能包含简单的值,如字符串、整数、布尔值、日期等。它不能包含复杂的对象。我怀疑你真正想要的是:
List<User> list = LoadUsers();
JObject json = new JObject();
json["users"] = JToken.FromObject(list);
以上将User
对象列表转换为代表用户的 a of,然后将其分配给JArray
new上的属性。您可以通过检查 的属性来确认这一点,看看它是 。JObjects
users
JObject
Type
json["users"]
Array
相反,如果您json["users"] = new JValue(JsonConvert.SerializeObject(list))
按照此问题的另一个答案(现已删除)中的建议进行操作,您可能不会得到您正在寻找的结果。这种方法会将用户列表序列化为一个字符串,从中创建一个简单的,JValue
然后将 分配JValue
给users
. JObject
如果您检查 的Type
属性json["users"]
,您会发现它是String
。这意味着,如果您稍后尝试使用 将 转换JObject
为 JSON json.ToString()
,您将获得双序列化输出,而不是您可能期望的 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\"}]"
}