使用Jackson ObjectMapper readTree如何将JSON布尔值转为字符串?
问题:Jackson ObjectMapper反序列化时将布尔值转为字符串
原始JSON数据:
{ "data":{ "id":"550e8400-e29b-41d4-a716-446655440000", "timestamp":"2023-05-01T16:34:16.993007076Z", "isProcessed":true, "isFailed":false } }
期望处理后的格式:
{ "data":{ "id":"550e8400-e29b-41d4-a716-446655440000", "timestamp":"2023-05-01T16:34:16.993007076Z", "isProcessed":"true", "isFailed":"false" } }
当前代码:
val data: JsonNode = objectMapper.readTree(logEvent) saveData(data) // Store as jsonb
请问是否需要为ObjectMapper添加自定义反序列化器?
解答
不需要额外添加自定义反序列化器,有两种简便方案可选:
方案一:全局配置布尔值序列化规则
通过注册自定义SimpleModule,让Jackson在序列化时自动将布尔值转为字符串,无需修改反序列化逻辑:
val module = SimpleModule() // 处理基本类型Boolean module.addSerializer(Boolean::class.java, object : JsonSerializer<Boolean>() { override fun serialize(value: Boolean?, gen: JsonGenerator, serializers: SerializerProvider) { gen.writeString(value.toString()) } }) // 处理包装类型Boolean module.addSerializer(java.lang.Boolean::class.java, object : JsonSerializer<java.lang.Boolean>() { override fun serialize(value: java.lang.Boolean?, gen: JsonGenerator, serializers: SerializerProvider) { gen.writeString(value.toString()) } }) objectMapper.registerModule(module) // 后续正常处理数据 val data: JsonNode = objectMapper.readTree(logEvent) saveData(data)
注:该配置会影响全局所有布尔值的序列化行为,适合需要统一转换的场景。
方案二:手动遍历修改指定字段
如果只需要转换特定字段,可直接遍历JsonNode修改字段类型:
val rootNode = objectMapper.readTree(logEvent) val dataNode = rootNode.get("data") // 转换isProcessed字段 if (dataNode.has("isProcessed") && dataNode.get("isProcessed").isBoolean) { dataNode.put("isProcessed", dataNode.get("isProcessed").asText()) } // 转换isFailed字段 if (dataNode.has("isFailed") && dataNode.get("isFailed").isBoolean) { dataNode.put("isFailed", dataNode.get("isFailed").asText()) } saveData(rootNode)
这种方式更灵活,仅针对目标字段修改,不会影响其他布尔值的处理。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

