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

如何阻止反序列化JSON属性中嵌套的JSON字符串?

这个问题在日常JSON序列化/反序列化场景里挺常见的——核心诉求就是让反序列化器别自作主张解析某个字段的JSON字符串内容,老老实实把它当成普通字符串保留下来。下面结合几种主流的序列化工具,给你具体的实现方案:

Java(Jackson)

如果你用的是Java生态最常用的Jackson库,可以直接给目标字段添加@JsonRawValue注解,明确告诉序列化/反序列化器:这个字段的内容是原始JSON字符串,不需要解析。

示例实体类:

public class Parent {
    private String name;
    // 标记该字段为原始JSON字符串,不自动解析
    @JsonRawValue
    private String data;

    // 省略getter、setter和构造方法
}

当你反序列化图A的JSON时:

String jsonA = "{ \"name\" : \"parent\", \"data\" : \"{ \\\"name\\\" : \\\"child\\\", \\\"data\\\" : \\\"foobar\\\" }\" }";
Parent parent = new ObjectMapper().readValue(jsonA, Parent.class);
// parent.getData() 返回的是原始字符串:"{ \"name\" : \"child\", \"data\" : \"foobar\" }"

而反序列化图B的JSON时,data字段会被解析成嵌套对象(需要你提前定义对应的Child类),和图A的结果完全区分开。

C#(Newtonsoft.Json / System.Text.Json)

Newtonsoft.Json(Json.NET)

只要你在实体类里把data字段定义为string类型,默认情况下反序列化器就会直接读取图A中data的字符串值,不会解析成嵌套对象:

public class Parent {
    public string Name { get; set; }
    public string Data { get; set; }
}

// 反序列化图A的JSON
string jsonA = "{ \"name\" : \"parent\", \"data\" : \"{ \\\"name\\\" : \\\"child\\\", \\\"data\\\" : \\\"foobar\\\" }\" }";
Parent parent = JsonConvert.DeserializeObject<Parent>(jsonA);
// parent.Data 是原始JSON字符串,而非嵌套对象

如果遇到特殊情况(比如动态类型解析),可以显式指定转换器确保字段被当作字符串处理:

public class Parent {
    public string Name { get; set; }
    [JsonConverter(typeof(StringConverter))]
    public string Data { get; set; }
}

System.Text.Json(.NET Core 内置)

和Json.NET逻辑类似,只要实体类的Data属性是string类型,默认就会保留原始字符串:

public class Parent {
    public string Name { get; set; }
    public string Data { get; set; }
}

// 反序列化
string jsonA = "{ \"name\" : \"parent\", \"data\" : \"{ \\\"name\\\" : \\\"child\\\", \\\"data\\\" : \\\"foobar\\\" }\" }";
Parent parent = JsonSerializer.Deserialize<Parent>(jsonA);

Python(标准库json模块)

Python的json模块默认会把JSON字符串中的字符串值直接解析为Python的str类型,不需要额外配置:

import json

# 图A的JSON字符串
json_a = '{"name": "parent", "data": "{ \\"name\\": \\"child\\", \\"data\\": \\"foobar\\" }"}'
result = json.loads(json_a)

print(type(result['data']))  # 输出:<class 'str'>
print(result['data'])        # 输出:"{ \"name\" : \"child\", \"data\" : \"foobar\" }"

如果之后需要把这个字符串解析成嵌套字典,再手动调用json.loads(result['data'])即可,完全可控。

关键注意事项

  1. 确保JSON格式合法:图A中data字段的字符串必须正确转义(比如内部的双引号要用\转义),否则JSON本身就会无效,反序列化器直接报错。
  2. 字段类型匹配:无论用哪种工具,核心原则是让目标字段的类型和JSON中的值类型匹配(字符串对应字符串),避免反序列化器自动做类型转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:26:45