使用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
相关产品推荐
相关产品推荐

