JSON反序列化嵌套对象失败,如何正确解析为目标实体类?
如何正确反序列化嵌套在object类型中的自定义对象?
问题场景
发送方序列化代码:
public class Rootobject { public int MessageState { get; set; } public object Message { get; set; } public object HeaderId { get; set; } } public class Message { public string FName { get; set; } public string LName { get; set; } public string Address { get; set; } } Rootobject ro = new Rootobject(); ro.HeaderId = "HID"; ro.MessageState = 0; ro.Message = new Message() { FName = "john", LName = "Doe", Address = "123456" }; string x = JsonConvert.SerializeObject(ro);
接收方反序列化代码:
public class Rootobject1 { public int MessageState { get; set; } public object Message { get; set; } public object HeaderId { get; set; } } public class Message1 { public string FName { get; set; } public string LName { get; set; } public string Address { get; set; } } var y = JsonConvert.DeserializeObject<Rootobject1>(receivedMsg);
此时y.Message会被解析为JObject而非Message1,无法直接当作自定义对象使用。
解决方案
方案1:将Rootobject1的Message属性改为具体类型
如果接收方明确知道Message字段的类型是Message1,直接修改Rootobject1的属性类型:
public class Rootobject1 { public int MessageState { get; set; } public Message1 Message { get; set; } // 替换object为Message1 public object HeaderId { get; set; } } // 反序列化代码不变,此时y.Message会直接是Message1实例 var y = JsonConvert.DeserializeObject<Rootobject1>(receivedMsg);
这是最直接高效的方案,无需额外转换步骤。
方案2:手动将JObject转换为Message1
如果必须保留Message属性为object类型,反序列化后可以手动转换:
var y = JsonConvert.DeserializeObject<Rootobject1>(receivedMsg); // 方法1:用JsonConvert重新反序列化 Message1 msg = JsonConvert.DeserializeObject<Message1>(y.Message.ToString()); // 方法2:用JObject的ToObject方法转换 Message1 msg = ((JObject)y.Message).ToObject<Message1>();
方案3:启用类型名称处理(需发送方配合)
如果发送方和接收方可以协调,通过TypeNameHandling让JSON包含类型信息,接收方就能自动解析:
发送方修改序列化代码:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; string x = JsonConvert.SerializeObject(ro, settings);
接收方修改反序列化代码:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; var y = JsonConvert.DeserializeObject<Rootobject1>(receivedMsg, settings); // 此时y.Message会自动转换为对应的类型(需Message和Message1结构完全一致)
注意:启用TypeNameHandling会在JSON中增加类型标识,若JSON来源不可信,可能带来安全风险,需谨慎使用。
内容的提问来源于stack exchange,提问作者user14267126
相关产品推荐
相关产品推荐

