2009-07-30 24 views
12
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 

回答

37

一个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\"}]" 
} 
+1

为我工作!谢谢 – s0nica 2014-01-24 10:33:22

0

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

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

如果你想JSON数组的根名称为“用户”,您可以使用

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