创建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); 完成…

http://code.google.com/p/google-gson/

正如我在评论中所说的那样,JSON是无效的,并且没有任何意义可以逃避它。 你应该以不同的方式处理它。

您应该将该对象放在属性中。

我想你想拥有类似的东西

{"myString":"{\"fake json\":\"foo\"}"}

相反,你应该:

{"myString":{"fake json":"foo"}}

这应该是处理这个问题的正确方法。