gpt4 book ai didi

java - 创建 Json 字符串

转载 作者:行者123 更新时间:2023-11-29 07:57:09 25 4
gpt4 key购买 nike

我使用 Jackson 库来生成这样的 json 字符串:

ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(model);

例如,这段代码会生成如下内容:

{"x" : "This is x", "y" : "This is y"}

但我想生成这样的东西:

{'x' : 'This is x', 'y' : 'This is y'}

我的意思是如何用单引号字符串更改双引号字符串。我尝试像这样更改代码:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
String str = objectMapper.writeValueAsString(model);

但是这个片段代码生成了第一个。当然我可以用 replace 方法处理这个问题,但我希望 Jackson 库为我做这个。 我该如何处理这个问题?

最佳答案

objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); 是关于在反序列化(JSON 到对象)中允许单引号,而不是根据需要序列化(对象到 JSON)。

在序列化中,问题似乎与 Jackson 1.X 的默认序列化程序有关。下面是 Jackson 用来编写 String 值的代码。如您所见,双引号是硬编码的,因此无法通过配置更改:

@Override
public void writeString(String text)
throws IOException, JsonGenerationException
{
_verifyValueWrite("write text value");
if (text == null) {
_writeNull();
return;
}
if (_outputTail >= _outputEnd) {
_flushBuffer();
}
_outputBuffer[_outputTail++] = '"'; // <----------------- opening quote
_writeString(text); // <----------------- string actual value
// And finally, closing quotes
if (_outputTail >= _outputEnd) {
_flushBuffer();
}
_outputBuffer[_outputTail++] = '"'; // <----------------- closing quote
}

要实现你想要的,至少有两种选择:


1:使用正则表达式替换引号:

这是一种安全的方法,因为 Jackson 给出的双引号 (") 已经转义 (\")。您所要做的就是转义单引号并在属性名称和值周围切换 ":

ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(model);
System.out.println("Received.: "+str);
str = str.replaceAll("'", "\\\\'"); // escapes all ' (turns all ' into \')
str = str.replaceAll("(?<!\\\\)\"", "'"); // turns all "bla" into 'bla'
System.out.println("Converted: "+str);

输出:

Received.: {"x":"ab\"c","y":"x\"y'z","z":15,"b":true}
Converted: {'x':'ab\"c','y':'x\"y\'z','z':15,'b':true}

或 2:在每个 String 字段上使用自定义 JsonSerializer

声明自定义序列化程序:

public class SingleQuoteStringSerializer extends JsonSerializer<String> {
@Override
public void serialize(String str, JsonGenerator jGen, SerializerProvider sP)
throws IOException, JsonProcessingException {
str = str.replace("'", "\\'"); // turns all ' into \'
jGen.writeRawValue("'" + str + "'"); // write surrounded by single quote
}
}

在你想要单引号的字段中使用它:

public class MyModel {
@JsonSerialize(using = SingleQuoteStringSerializer.class)
private String x;
...

然后照常进行(QUOTE_FIELD_NAMES == false 用于取消引用字段名称):

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
String str = objectMapper.writeValueAsString(model);
System.out.println("Received.: "+str);

输出:

Received.: {x:'ab"c',y:'x"y\'z',z:15,b:true}

注意:由于您似乎想要将 JSON 嵌入到另一个中,最后一种方法可能还需要转义 "(请参阅 x:'ab"c').

关于java - 创建 Json 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com