[英]JSon.NET deserializing object doesn't work
因此,我有一个使用此类进行通信的客户端-服务器应用程序,它包含一个对象,因此我可以在服务器和客户端之间发送任何类型的数据:
public class comObj
{
public eDisconnectedReason dcReason;
public object payload;
}
在通过套接字发送之前,我将使用JSon.Net将其序列化,例如:
string jsonString = JsonConvert.SerializeObject((new Common.comObj() { dcReason = Server.disconnectedReason, payload = Data }), Formatting.None);
现在服务器完全接收到客户端发送的字符串:
sent string: "{\"dcReason\":4,\"payload\":{\"msg\":\"hi\"}}"
received string: "{\"dcReason\":4,\"payload\":{\"msg\":\"hi\"}}"
但是,当我尝试将接收到的字符串反序列化为原始comObj时:
Common.comObj rcvdObj = JsonConvert.DeserializeObject<Common.comObj>(rcvdString);
rcvdObj.payload的类型为Newtonsoft.Json.Linq.JObject,而不是object。
让我们首先考虑您的JSON输入:
{
"dcReason": 4,
"payload": {
"msg": "hi"
}
}
使用Json.NET,您有两种反序列化JSON数据的关键方法。 您可以:
JToken
类型。 (你的情况,它实例化一个JObject
-的一个子类JToken
-因为JSON.Net认识到,JSON输入指定的对象,而不是一个基本类型或阵列) 在您的情况下,您实际上最终混合了这两种方法。 由于您为根对象指定了特定类型,因此它返回了comObj
的实例。 由于您仅将object
指定为属性payload
的类型,因此Json.NET会尽力而为,并简单地恢复为选项2),并为您提供一个JObject
实例,其中包含msg
等数据。
您有两种选择来解决您的问题。 您可以:
payload
属性查询为JObject
,就像如果您不使用选项1)一样,必须对整个JSON主体执行操作。 payload
属性。 我强烈建议使用这种方法,因为它更加类型安全,并且使用起来也更容易。 要实现前者,您可以使用诸如o["msg"]
-本质上就像字典。
要实现后者(我建议),只需定义payload
的类型。 换句话说,将您的代码更改为:
public class comObj
{
public eDisconnectedReason dcReason;
public Payload payload;
}
public class Payload
{
public string msg { get; set; }
}
现在,当您反序列化JSON时,就可以使用以下语法:
Console.WriteLine(rcvdObj.payload.msg);
而且-重要的是-如果您以后决定将JSON有效负载中的msg
重命名为message
那么您将能够正确地将有效负载的msg
属性重构为message
并期望所有用法都将得到修复。 使用字符串时,这显然不那么健壮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.