You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:37:47