在fasterxml的JsonParser中,我想从属性中获取原始文本



我有一个示例代码片段,它解析我试图获取值的原始文本的JSON。我想为XML正确转义文本。

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;
}
}

我如何得到u0000的输出而不是空字符?

我的依赖项如下:

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

解决方案是使用

"{ "value": "\\u0000" }"

换句话说,将反斜杠加倍。

如果您在Java字符串字面值中使用\0000,那么Java将知道您没有Unicode转义序列(您不希望U0000被解释为空字符)。

但是这意味着Java将把u0000传递给JSON解析器。

解析器随后将应用JSON自己关于反斜杠的规则——反斜杠也充当转义字符。因此,JSON现在将u0000解释为空字符。

通过将反斜杠从2加倍到4,您将确保JSON接收到包含\u0000的字符串。Java将在结果字符串中将每一对反斜杠减少为单个文字反斜杠。

这意味着JSON将知道它是一个文字u0000字符串,而不是空字符。

相关内容

  • 没有找到相关文章