我有一个示例代码片段,它解析我试图获取值的原始文本的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
字符串,而不是空字符。