如何使用Java Jackson2库提取ObjectNode中data字段为JSON字符串
使用Jackson2提取JSON中嵌套对象为JSON字符串的解决方案
问题原因
你代码返回空值的核心原因是JsonNode.asText()方法的使用场景错误:
asText()方法仅能用于JSON字符串类型的节点,会返回节点存储的文本值。而你需要提取的payload.data是JSON对象类型节点,不是预先序列化好的字符串,调用asText()只会返回空值。
修正方案
你需要使用Jackson的ObjectMapper提供的writeValueAsString()方法,直接将data节点序列化为标准JSON字符串即可,修正后的代码如下:
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper, ObjectNode} import com.fasterxml.jackson.module.scala.DefaultScalaModule object StreamData { // 全局复用ObjectMapper实例,不要每次调用方法都新建,避免性能损耗 private val objectMapper: ObjectMapper = new ObjectMapper() .registerModule(DefaultScalaModule) // 适配Scala类型序列化的模块,按需引入 case class StreamDatas_rows(data: String) def jsonToRow(json_object: ObjectNode): StreamDatas_rows = { val dataNode = json_object.path("payload").path("data") val hugeString = if (dataNode.isMissingNode || dataNode.isNull) { "" } else { // 直接把对象节点序列化为JSON字符串 objectMapper.writeValueAsString(dataNode) } StreamDatas_rows(hugeString) } }
可选配置
如果需要输出带缩进、格式化的JSON字符串,可以在初始化ObjectMapper时开启格式化配置:
import com.fasterxml.jackson.databind.SerializationFeature private val objectMapper: ObjectMapper = new ObjectMapper() .registerModule(DefaultScalaModule) .enable(SerializationFeature.INDENT_OUTPUT) // 开启格式化输出
注意事项
- 优先使用
path()方法代替get()读取节点,中间节点不存在时会返回MissingNode而非空指针,配合判空逻辑稳定性更高。
内容的提问来源于stack exchange,提问作者SatriaNegaraaa
相关产品推荐
相关产品推荐

