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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:54:00