mrb*_*lah 24 c# asp.net json json.net
List<User> list = LoadUsers();
JObject json = new JObject();
json["users"] = new JValue(list);
Run Code Online (Sandbox Code Playgroud)
似乎没有工作?
错误:
Could not determine JSON object type for type System.Collections.Generic.List`1
Run Code Online (Sandbox Code Playgroud)
Bri*_*ers 52
A JValue只能包含简单的值,如字符串,整数,布尔值,日期等.它不能包含复杂的对象.我怀疑你真正想要的是这个:
List<User> list = LoadUsers();
JObject json = new JObject();
json["users"] = JToken.FromObject(list);
Run Code Online (Sandbox Code Playgroud)
上面将User对象列表转换JArray为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; }
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
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\"}]"
}
Run Code Online (Sandbox Code Playgroud)
我遇到了这个问题,如果您只想要没有根名称的数组项,您现在可以使用 JArray 来完成此操作。
var json = JArray.FromObject(LoadUsers());
Run Code Online (Sandbox Code Playgroud)
如果您希望 json 数组的根名称为“users”,则可以使用
var json = new JObject { ["users"] = JToken.FromObject(LoadUsers()) };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24826 次 |
| 最近记录: |