Java 使Jackson对输入JSON更友好

Java 使Jackson对输入JSON更友好,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,我是否有办法降低Jackson对输入JSON的要求。例如,JSONObject提供以下津贴: 构造器在他们将接受的文本中更加宽容: 右大括号前面可能会出现一个额外的(逗号) 字符串可以用“(单引号)引起来 如果字符串不以引号或单引号开头,并且不包含前导空格或尾随空格,并且不包含以下任何字符,则根本不需要使用引号:{}[]/\:,=;#如果它们看起来不像数字,如果它们不是保留字true、false或null* 键后面可以跟有=或=>以及: 值后面可以是;(分号)以及by(逗号) 数字可以有0x-(

我是否有办法降低Jackson对输入JSON的要求。例如,JSONObject提供以下津贴:

构造器在他们将接受的文本中更加宽容:

  • 右大括号前面可能会出现一个额外的(逗号)
  • 字符串可以用“(单引号)引起来
  • 如果字符串不以引号或单引号开头,并且不包含前导空格或尾随空格,并且不包含以下任何字符,则根本不需要使用引号:{}[]/\:,=;#如果它们看起来不像数字,如果它们不是保留字true、false或null*
  • 键后面可以跟有=或=>以及:
  • 值后面可以是;(分号)以及by(逗号)
  • 数字可以有0x-(十六进制)前缀
  • 我最感兴趣的是第三点。它允许进行以下转换:

    new JSONObject("{A : 1}");
    
    。。。但对于jackson,我将得到一个输入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)
    

    查看相关问题。它展示了如何配置
    ObjectMapper
    来做您想要做的事情,并且它还对您为什么不想这样做进行了一些很好的讨论:)

    非标准JSON的扩展列表(即不是JSON的东西,但是非常接近,可以支持它)可以从以下位置找到:

    从您的列表中,(2)和(3)可以完成(再加上一些其他未列出的事情,如commnet)。其他人不受支持;尽管该项目增加了对一些常用扩展的支持,但考虑的范围还是有限的。当然,总是可以要求新的特性;根据请求、用例添加特性

    在我个人看来,一个人要么遵循标准,要么定义新的格式——HTML就是一个很好的例子,说明当试图支持“几乎但不完全”有效的东西时,会遇到老鼠洞。调整永无止境,互操作性受到影响:因为没有标准,所有实现都支持一些不兼容的特性和构造子集