Jackson如何输出无外层方括号的JsonNode数组及POJO数组?
Jackson序列化输出无外层方括号的数组元素拼接内容
针对当前JsonNode场景的实现
有两种常用的实现方案,均基于Jackson原生能力,不会破坏JSON结构:
方案1:元素单独序列化后拼接
逻辑简单直接,适合元素数量少的场景:
val message = """{"Type": "Type1","MessageId": "MessageId1"}""" val msgNode = objectMapper.readTree(message) val msgNodes = List(msgNode, msgNode).asJavaCollection // 直接拼接每个元素的序列化结果,分隔符用逗号 val result = msgNodes.joinToString(",") { objectMapper.writeValueAsString(it) }
方案2:使用SequenceWriter流式输出
性能更优,适合元素数量多的场景,避免多次序列化的内存开销:
val message = """{"Type": "Type1","MessageId": "MessageId1"}""" val msgNode = objectMapper.readTree(message) val msgNodes = List(msgNode, msgNode).asJavaCollection val stringWriter = StringWriter() // 构造序列写入器,默认不会生成外层数组的方括号 val sequenceWriter = objectMapper.writer().writeValues(stringWriter) msgNodes.forEach { sequenceWriter.write(it) } sequenceWriter.close() val result = stringWriter.toString()
两种方案的输出都符合你需要的格式,不会带外层方括号。
针对POJO类数组的扩展实现
两种方案可以直接复用,不需要额外改造,Jackson原生支持POJO的序列化,示例如下:
首先定义POJO类:
data class Message( val Type: String, val MessageId: String )
序列化POJO集合:
val pojoList = listOf( Message("Type1", "MessageId1"), Message("Type1", "MessageId1") ) // 方案1:拼接实现 val result1 = pojoList.joinToString(",") { objectMapper.writeValueAsString(it) } // 方案2:流式实现 val stringWriter = StringWriter() val sequenceWriter = objectMapper.writer().writeValues(stringWriter) pojoList.forEach { sequenceWriter.write(it) } sequenceWriter.close() val result2 = stringWriter.toString()
注意事项
- 不要直接对完整数组序列化结果做首尾字符截取,极端情况下如果元素内部包含方括号会破坏JSON结构,上述两种方案均基于Jackson原生序列化逻辑,完全兼容各种特殊字符转义场景。
- 如果需要输出JSON Lines格式(每个元素单独占一行),可以将joinToString的分隔符改为
",\n",或者在构造SequenceWriter时使用带格式化的配置:objectMapper.writerWithDefaultPrettyPrinter().writeValues(stringWriter)。
内容的提问来源于stack exchange,提问作者Vivek Shah
相关产品推荐
相关产品推荐

