我已经在这里阅读了其他关于这个问题的帖子
使用Json.NET 序列化对象列表
将列表序列化为JSON
在序列化期间使用json.net合并两个对象?
所有这些都非常有用。当然,我可以在一个json中序列化两个列表,但我不能反序列化它
我正在使用Json Newtonsoft,C#,MVC5,框架4.5。这就是场景:
C#代码
public class User
{
public int id { get; set; }
public string name { get; set; }
}
public class Request
{
public int id { get; set; }
public int idUSer{ get; set; }
}
List<User> UserList = new List<User>();
List<Request> RequestList = new List<Request>();
string json= JsonConvert.SerializeObject(new { UserList, RequestList });
JSON RESULT
{
"UserList":[
{
"id":1,
"name":"User 1"
},
{
"id":2,
"name":"User 2"
},
{
"id":3,
"name":"User 3"
}
],
"RequestList":[
{
"id":1,
"idUSer":1
},
{
"id":2,
"idUSer":1
},
{
"id":3,
"idUSer":1
},
{
"id":4,
"idUSer":2
}
]
}
C#去串行化
我不知道如何配置Json的设置。反序列化<,的Settings>(json)指示要反序列化的对象类型。
更改方法
因此,改变了方法,我创建了一个新的类"Cover",以便将列表放在一起并序列化一个对象
public class Cover
{
private List<User> user = new List<User>();
private List<Request> request = new List<Request>();
public List<User> User
{
get { return user;}
set { User = value;}
}
public List<Request> Request
{
get {return request;}
set {Request = value;}
}
}
串行化
string json = JsonConvert.SerializeObject(cover);
JSONJSON结果相同。
降级
Cover result = JsonConvert.DeserializeObject<Cover>(json, new
JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
工作不错。我的情况得到了解决,但我对概念有疑问,在我的脑海中有一些不清楚的东西:
我的问题是:
对于第一个方案:
你认为有没有一种方法可以反序列化具有不同对象列表的json?这不是一个好的做法吗?
第二个问题:为什么json在第一种情况下是相等的?
在JSON.NET中,您需要指定要反序列化的类型,方法是将其名称作为类型参数提供给DeserializeObject
。然而,在这一行:
string json= JsonConvert.SerializeObject(new { UserList, RequestList });
您可以创建匿名对象,然后将其序列化为new { UserList, RequestList }
。所以有一个问题——不能使用匿名类型作为类型参数。为了处理这种情况,JSON.NET提供了DeserializeAnonymousType<>
。它不需要您提供类型参数;实际上,您不能反序列化匿名类型。相反,它是根据传递给方法的第二个参数的类型推断出来的。因此,您只需创建一个没有数据的伪匿名对象,并将其传递给此方法。
// jsonData contains previously serialized List<User> and List<Request>
void DeserializeUserAndRequest(string jsonData)
{
var deserializedLists = new {
UserList = new List<User>(),
RequestList = new List<Request>()
};
deserializedLists = JsonConvert.DeserializeAnonymousType(jsonData, deserializedLists);
// Do your stuff here by accessing
// deserializedLists.UserList and deserializedLists.RequestLists
}
当然,这一切都很好,但这种方法表明您已经知道序列化数据的结构。如果这个结构与您初始化的匿名类型的结构不匹配,那么在DeserializeAnonymousType
方法之后您将一无所获。这不仅对匿名类型的属性类型有效,对它们的名称也有效。
回答您的第一个问题:
我认为Cover类的选项是"最佳实践",因为您正在使用相同的模型进行序列化和反序列化,这一切都取决于Json.NET来找出如何实现(反)序列化的魔力。
如果出于某种原因你不想使用这种方法,还有两个其他选择:
- 匿名类型:http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm
- 反序列化到字典中:http://www.newtonsoft.com/json/help/html/DeserializeDictionary.htm
对于您的第二个问题-您确定两种方法生成的JSON完全相同吗?(您可以使用www.diffchecker.com等工具进行验证)
使用第二种方法时,顶级名称应该不同——它应该是"Users"而不是"UserList",应该是"Requests",而不是"RequestList">