com.jayway.jsonpath解析数组时冒号转等号的问题及解决咨询
Jayway JsonPath解析后冒号变等号的解决办法
你遇到的问题是因为doc.read(str)返回的是Java集合(Map/List)对象,直接调用toString()会使用Java集合的默认字符串格式,因此冒号被替换成了等号。要保留原始JSON格式,需要将解析得到的对象重新序列化为JSON字符串,而非直接调用toString方法。
解决步骤
添加JSON序列化依赖
由于Jayway JsonPath默认依赖Jackson处理JSON,需要确保项目中引入Jackson的databind模块(Scala项目可额外添加Scala模块以支持Scala类型)。以sbt为例:libraryDependencies ++= Seq( "com.jayway.jsonpath" % "json-path" % "2.7.0", "com.fasterxml.jackson.core" % "jackson-databind" % "2.15.2", "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.15.2" // Scala项目可选 )修改代码实现序列化
使用Jackson的ObjectMapper将解析出的集合对象重新序列化为标准JSON字符串:import com.jayway.jsonpath.Configuration import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.Option.DEFAULT_PATH_LEAF_TO_NULL import com.fasterxml.jackson.databind.ObjectMapper val conf = Configuration.defaultConfiguration.addOptions(DEFAULT_PATH_LEAF_TO_NULL) val objectMapper = new ObjectMapper() // Scala项目需注册Scala模块 // objectMapper.registerModule(com.fasterxml.jackson.module.scala.DefaultScalaModule) val doc = JsonPath.using(conf).parse(input) // 直接读取records数组,简化循环逻辑 val records = doc.read[java.util.List[Any]]("$.records") records.forEach { rec => val recJson = objectMapper.writeValueAsString(rec) println(recJson) }
优化说明
- 避免手动计算数组长度和索引循环,直接读取
$.records数组进行遍历,代码更简洁可靠。 - 通过
ObjectMapper序列化后,输出的结果会严格保持JSON格式,冒号、引号等符号都会正确保留。
内容的提问来源于stack exchange,提问作者sam.ban
相关产品推荐
相关产品推荐

