JSON Newtonsoft C#序列化/反序列化对象列表的良好实践



我已经在这里阅读了其他关于这个问题的帖子

使用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">

相关内容

  • 没有找到相关文章

最新更新