使 Jackson 对输入 JSON 更友好

2022-09-04 02:56:42

我有没有办法让杰克逊对输入JSON不那么严格。例如,JSONObject提供以下限额:

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

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

对我来说最有趣的是第三点。它允许以下转换:

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)

答案 1

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

从您的列表中,可以完成(2)和(3)(以及其他一些未列出的操作,例如commnets)。不支持其他;尽管 Project 添加了对一些常用扩展的支持,但要考虑的内容有限。当然,总是可以要求新功能。功能是根据请求、用例添加的。

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


答案 2

看看这个相关的问题。它显示了如何配置一个来做你想做的事情,并且它也有一些关于为什么你可能不想做那个:)ObjectMapper