Jackson ObjectMapper输出字符串至OutputStream时自动添加转义字符如何解决?
问题:Jackson ObjectMapper输出字符串时出现额外转义字符怎么解决?
我用Jackson的ObjectMapper写了如下代码,把字符串写入输出流:
OutputStream outputStream = new PrintStream(System.out); ObjectMapper objectMapper = new ObjectMapper(); String output = "{\"test\":\"mytest/123\"}"; objectMapper.writeValue(outputStream, output);
运行后输出流打印出带额外转义字符的字符串:
"{\"vfi\":\"test/mytest/123\"}"
我没调用ObjectMapper.writeValueAsString,但还是出现了转义字符,该怎么避免?
解决方案
原因说明
你传入writeValue的是字符串类型的JSON内容,ObjectMapper会把它当作普通Java字符串处理——序列化普通字符串时,Jackson会自动对字符串内部的引号做转义,同时给整个字符串包裹一层引号,所以才会出现你看到的结果。
两种解决办法
办法1:直接用输出流写入字符串
既然你已经有了现成的合法JSON字符串,完全不需要通过ObjectMapper处理,直接用输出流写入即可:
import java.io.OutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; public class Main { public static void main(String[] args) { OutputStream outputStream = new PrintStream(System.out); String output = "{\"test\":\"mytest/123\"}"; try { outputStream.write(output.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { e.printStackTrace(); } } }
办法2:先解析JSON字符串为Jackson的JSON结构,再输出
如果一定要用ObjectMapper处理,先把字符串解析成JsonNode(或者自定义POJO、Map),让Jackson识别这是JSON结构而非普通字符串,再序列化输出:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.OutputStream; import java.io.PrintStream; public class Main { public static void main(String[] args) { OutputStream outputStream = new PrintStream(System.out); ObjectMapper objectMapper = new ObjectMapper(); String output = "{\"test\":\"mytest/123\"}"; try { // 解析为JsonNode再输出 JsonNode jsonNode = objectMapper.readTree(output); objectMapper.writeValue(outputStream, jsonNode); // 或者解析为Map(如果知道结构,用自定义POJO更规范) // Map<String, String> jsonMap = objectMapper.readValue(output, new TypeReference<Map<String, String>>() {}); // objectMapper.writeValue(outputStream, jsonMap); } catch (Exception e) { e.printStackTrace(); } } }
这两种方式都能输出正常的JSON:{"test":"mytest/123"},不会出现额外的转义字符。
内容的提问来源于stack exchange,提问作者AnOldSoul
相关产品推荐
相关产品推荐

