让杰克逊对输入JSON更友好

时间:2011-04-12 14:43:02

标签: java json jackson deserialization

我是否有办法让杰克逊对输入JSON不那么严格。例如。 JSONObject提供以下允许:

  

构造者在他们接受的文本中更宽容:

     
      
  1. 额外的,(逗号)可能会出现在大括号之前。
  2.   
  3. 字符串可以引用'(单引号)。
  4.   
  5. 如果字符串不以引号或单引号开头,并且如果它们不包含前导或尾随空格,并且它们不包含任何这些字符,则根本不需要引用字符串:{} [] / \:,=; #并且如果它们看起来不像数字,并且它们不是保留字true,false或null。*
  6.   
  7. 键后面可以跟= = =>以及:。
  8.   
  9. 值可以跟随; (分号)以及(逗号)。
  10.   
  11. 数字可能有0x-(十六进制)前缀。
  12.   

对我来说最有趣的是第3点。它允许跟随转换:

new JSONObject("{A : 1}");

...但对于杰克逊,我会得到一个错误,输入相同的json:

new ObjectMapper().readTree("{ A : 1}"); // throws an exception

例外:

org.codehaus.jackson.JsonParseException: Unexpected character ('A' (code 65)): was expecting double-quote to start field name
   at [Source: java.io.StringReader@26d4f1; line: 1, column: 4]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:943)
at org.codehaus.jackson.impl.JsonParserBase._reportError(JsonParserBase.java:636)
at org.codehaus.jackson.impl.JsonParserBase._reportUnexpectedChar(JsonParserBase.java:569)
at org.codehaus.jackson.impl.ReaderBasedParser._handleUnusualFieldName(ReaderBasedParser.java:342)
at org.codehaus.jackson.impl.ReaderBasedParser._parseFieldName(ReaderBasedParser.java:235)
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:125)
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:180)
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeAny(JsonNodeDeserializer.java:210)
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:52)
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:13)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1130)

2 个答案:

答案 0 :(得分:12)

非标准JSON的扩展名列表(即非JSON的东西,但足够接近可以支持)可以从以下网址找到:http://wiki.fasterxml.com/JacksonFeaturesNonStandard

从您的列表中,可以完成(2)和(3)(以及未列出的其他几项内容,如commnets)。其他人不受支持;尽管项目已经增加了对常用扩展的支持,但对于将要考虑的内容存在限制。当然总是可以要求新功能;功能是根据请求,用例添加的。

在我个人看来,应该遵循标准,或者定义新的格式 - HTML是一个很好的例子,当我试图支持“几乎但不完全”有效的东西时会遇到一些问题。调整没有尽头,互操作性受到影响:由于没有标准,所有实现都支持一些不兼容的功能和结构子集。

答案 1 :(得分:4)

查看this相关问题。它显示了如何配置ObjectMapper以执行您想要的操作,并且还有一些关于您可能不想这样做的讨论:)