如何强制jayway-jsonpath将字符串保留为字符串而非整数
解决Jayway JsonPath保留JSON原始类型的问题
默认情况下Jayway JsonPath会自动把类似"01234"这种数值形式的字符串转成整数,导致前导零丢失,还没法区分原始的字符串和数字类型。要让它严格保留JSON里的原始类型,可以试试下面两种方法:
解决思路
Jayway的默认解析器会自动做类型转换,我们要么修改配置禁用这个行为,要么直接读取原始的JSON节点来保留类型信息。
方法一:配置禁用自动类型转换
通过Configuration自定义解析配置,用Jackson作为JSON提供者,关闭自动类型转换逻辑:
import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.spi.json.JacksonJsonProvider; // 构建禁用自动类型转换的配置 Configuration config = Configuration.builder() .jsonProvider(new JacksonJsonProvider()) .build(); // 解析字符串类型的value String jsonStr = "{\"value\":\"01234\"}"; Object strResult = JsonPath.using(config).parse(jsonStr).read("$.value"); // strResult 是 String 类型,值为 "01234" // 解析整数类型的value String jsonInt = "{\"value\":56789}"; Object intResult = JsonPath.using(config).parse(jsonInt).read("$.value"); // intResult 是 Integer 类型,值为 56789
方法二:直接读取为JsonNode
如果项目里用Jackson做JSON处理,直接把结果读成JsonNode,能完全保留原始类型,还能主动判断类型:
import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.spi.json.JacksonJsonProvider; import com.fasterxml.jackson.databind.JsonNode; Configuration config = Configuration.builder() .jsonProvider(new JacksonJsonProvider()) .build(); // 解析字符串类型的节点 JsonNode strNode = JsonPath.using(config).parse("{\"value\":\"01234\"}").read("$.value", JsonNode.class); if (strNode.isTextual()) { String strValue = strNode.asText(); // 拿到原始字符串"01234" } // 解析整数类型的节点 JsonNode intNode = JsonPath.using(config).parse("{\"value\":56789}").read("$.value", JsonNode.class); if (intNode.isInt()) { int intValue = intNode.asInt(); // 拿到整数56789 }
注意事项
- 别用默认的
JsonSmartJsonProvider或者GsonJsonProvider,它们的自动类型转换逻辑会干扰原始类型保留,优先用JacksonJsonProvider。 - 如果需要额外的解析选项,比如避免异常或者统一返回列表,可以在配置里添加对应的
Option,比如.options(Option.SUPPRESS_EXCEPTIONS)。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

