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

使用Newtonsoft.Json序列化嵌套对象遇转义异常求助

解决Newtonsoft.Json嵌套对象序列化时的转义问题

问题根源是重复序列化:你的MyObject.Data是string类型,处理组对象时,你先把List<MyObject>序列化成JSON字符串赋值给parent.Data,之后整个MyObject再次被序列化时,这个字符串会被二次转义,导致出现大量\"。

核心解决方案:改用JToken存储Data字段

JToken是Newtonsoft.Json的核心抽象类型,能直接表示任意JSON元素(字符串、数组、对象等),从根源避免重复序列化带来的转义问题。

修改后的MyObject类

public class MyObject
{
    [JsonProperty(PropertyName = "type")]
    public string Type { get; set; }

    [JsonProperty(PropertyName = "data")]
    public JToken Data { get; set; } // 替换string为JToken

    [JsonConstructor]
    public MyObject()
    {
    }

    public MyObject(object obj)
    {
        // 直接将对象转为JToken,无需先序列化为字符串
        Data = JToken.FromObject(obj);
        Type = obj.GetType().FullName;
    }
}

修改后的GetMyObjectGroup方法

static MyObject GetMyObjectGroup(MyObjectGroup group)
{
    List<MyObject> children = new List<MyObject>();
    
    foreach (var obj in group.Objects)
    {
        if (obj == null)
            continue;
        if (obj.GetType() == typeof(MyObjectGroup))
            return GetMyObjectGroup(obj as MyObjectGroup);
            
        MyObject child = new MyObject();
        child.Type = obj.GetType().FullName;
        // 直接转为JToken,保留原序列化配置
        child.Data = JToken.FromObject(obj, GeometryResolver.Settings);
        children.Add(child);
    }

    MyObject parent = new MyObject();
    parent.Type = group.GetType().FullName;
    // 将子对象列表直接转为JToken数组
    parent.Data = JToken.FromObject(children);
    return parent;
}

原理说明

  • 当最终序列化整个MyObject实例时,JToken会直接被序列化为对应的JSON结构(数组、对象或字符串),不会被当作普通字符串进行转义。
  • 单个对象的Data会被序列化为JSON字符串(如{"version":1000}),组对象的Data会被序列化为JSON数组,完全匹配预期格式。

可选方案:自定义JSON转换器(不修改字段类型)

如果无法修改Data的字段类型,可以为MyObject添加自定义转换器,在序列化时判断Data内容是否为JSON结构,手动处理转义,但这种方式复杂度高,远不如改用JToken简洁。

内容的提问来源于stack exchange,提问作者andyopayne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:00:26