创建Json字符串
我使用Jackson库生成json字符串,如下所示:
ObjectMapper objectMapper = new ObjectMapper(); String str = objectMapper.writeValueAsString(model);
而这个剪切代码例如生成这样的somtething:
{"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);
但是这个剪切代码生成了第一个。 当然我可以用替换方法处理这个问题,但我希望jackson图书馆为我做这个。 我该如何处理这个问题?
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
是关于允许反序列化中的单引号(JSON到对象),而不是根据需要序列化(Objects to 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("(?
输出:
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 { @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
用于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嵌入到另一个中,因此最后一种方法可能还需要转义"
s”(请参阅x:'ab"c'
)。
按以下方式配置ObjectMapper:
final ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); //this may be what you need mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
试着看看gson。 在gson中它看起来像这样。 House myHouse = new House(); Gson gson = new Gson(); String json = gson.toJson(myHouse); 完成…
正如我在评论中所说的那样,JSON是无效的,并且没有任何意义可以逃避它。 你应该以不同的方式处理它。
您应该将该对象放在属性中。
我想你想拥有类似的东西
{"myString":"{\"fake json\":\"foo\"}"}
相反,你应该:
{"myString":{"fake json":"foo"}}
这应该是处理这个问题的正确方法。