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

如何在Jackson JsonParser中获取JSON属性的原始转义文本?

问题:Jackson Core解析JSON时获取原始转义文本而非解析后字符

使用Jackson Core 2.13.4版本的JsonParser编写代码,意图解析JSON并获取值的原始转义文本(用于后续XML转义),但解析{"value": "\u0000"}时,输出的是空字符而非原始的\u0000。

现有代码

package org.example;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

import java.io.IOException;

public class App
{
    public static void main( String[] args )
    {
        JsonFactory factory = createJsonFactory(true);
        try (final JsonParser parser = factory.createParser("{ \"value\": \"\\u0000\" }")) {
            JsonToken token;
            while ((token = parser.nextValue()) != null) {
                switch (token) {
                    case VALUE_STRING:
                        String text = parser.getText();
                        System.out.println(text);
                        break;

                    default:
                        break;
                }
            }

        } catch (JsonParseException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static JsonFactory createJsonFactory(boolean liberal) {
        JsonFactory factory = new JsonFactory();
        factory.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true);

        // duplicates are handled in readValue
        factory.configure(JsonParser.Feature.STRICT_DUPLICATE_DETECTION, false);
        if (liberal) {
            factory.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
            factory.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
            factory.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
            factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
            factory.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
        }
        return factory;
    }
}

依赖配置

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.13.4</version>
</dependency>

解决方案

Jackson默认会自动解析JSON中的转义字符,返回解析后的实际字符(比如\u0000会被解析为空字符)。要获取原始转义文本或标准转义格式,有两种可行方案:

方案1:从原始输入中截取转义文本

通过启用位置跟踪特性,获取字符串令牌在原始JSON中的位置,直接截取对应片段:

修改后的代码

public static void main( String[] args )
{
    String json = "{ \"value\": \"\\u0000\" }";
    JsonFactory factory = createJsonFactory(true);
    // 启用位置跟踪特性,用于获取令牌在原始输入中的偏移量
    factory.enable(JsonParser.Feature.INCLUDE_SOURCE_IN_LOCATION);
    
    try (final JsonParser parser = factory.createParser(json)) {
        JsonToken token;
        while ((token = parser.nextValue()) != null) {
            switch (token) {
                case VALUE_STRING:
                    // 获取字符串令牌的起始/结束偏移量,跳过前后的引号
                    long startOffset = parser.getTokenLocation().getCharOffset() + 1;
                    long endOffset = parser.getCurrentLocation().getCharOffset() - 1;
                    // 从原始JSON中截取原始转义文本
                    String rawEscapedText = json.substring((int) startOffset, (int) endOffset);
                    System.out.println(rawEscapedText); // 输出:\u0000
                    break;

                default:
                    break;
            }
        }

    } catch (JsonParseException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

注意事项

  • 该方法依赖原始输入字符串的可用性,如果输入是流,需要先将流读取到内存中;
  • 偏移量计算需跳过字符串前后的引号,确保截取的是引号内的原始内容。

方案2:通过JsonGenerator反向生成转义文本

利用Jackson的JsonGenerator将解析后的字符重新序列化为标准JSON转义格式,这种方式更适合后续XML转义需求(可统一处理所有需要转义的字符):

修改后的代码片段

case VALUE_STRING:
    String text = parser.getText();
    // 使用JsonGenerator将字符转回标准JSON转义格式
    StringWriter sw = new StringWriter();
    try (JsonGenerator gen = factory.createGenerator(sw)) {
        gen.writeString(text);
    }
    // 去掉生成结果前后的引号,得到纯转义文本
    String standardEscapedText = sw.toString().substring(1, sw.toString().length() - 1);
    System.out.println(standardEscapedText); // 输出:\u0000
    break;

优势

  • 无需依赖原始输入,Jackson自动处理所有控制字符、特殊字符的转义,生成符合规范的转义文本;
  • 输出的转义格式可直接用于XML转义场景,无需额外处理。

内容的提问来源于stack exchange,提问作者Loren Cahlander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:35:30