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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:40:23