【问题标题】:Jackson ObjectMapper with '/' Character as JSON key杰克逊 ObjectMapper 与 '/' 字符作为 JSON 键
【发布时间】:2016-04-12 18:42:25
【问题描述】:

JSON 设置 (my-file.json):

 { ":x.y\/a" : "some value" }

对象映射器:

ObjectMapper om = new ObjectMapper();
om.configure( JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true );
Map value = om.readValue( getClass().getResource( "/my-file.json" ).getFile() , HashMap.class );

我也尝试过使用 JsonParser.Feature.ALLOW_COMMENTS (这并没有什么意义,但我认为这到底是怎么回事)。但是,无论我如何尝试配置它,我似乎都可以将 JSON 读入 Map。

例外

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('/' (code 47)): maybe a (non-standard) comment? (not recognized as one since Feature 'ALLOW_COMMENTS' not enabled for parser)
at [Source: java.io.StringReader@31c74456; line: 1, column: 2]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1524)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:557)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:475)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipComment(ReaderBasedJsonParser.java:1725)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipWSOrEnd(ReaderBasedJsonParser.java:1708)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:562)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:2926)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2873)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)

任何关于我如何配置它的想法都将不胜感激。作为一种临时解决方法,我使用了 Gson 库,它可以很好地解析同一个文件。

new Gson().fromJson( new FileReader( getClass().getResource( /my-file.json ).getFile() ), HashMap.class );

虽然这确实有效,但我更喜欢 Jackson,因为我们在堆栈中的其他任何地方都使用它(没有反对 Gson,只是现在不想将其添加为依赖项)。

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    问题出在getClass().getResource( "/my-file.json" ).getFile()getFile() 返回文件路径而不是文件内容。 ObjectMapper readValue(String content, ..) 函数将内容作为其第一个参数。你可以使用

    Map value = om.readValue(getClass().getResourceAsStream("/my-file.json"), HashMap.class);
    

    om.readValue(new FileReader(path), HashMap.class); 像您的 Gson 示例也可以使用

    【讨论】:

    • “不是文件内容”,更重要的是,不是File 对象
    • 感谢您的快速回复。我应该仔细看看。可能不是方法的最佳名称,但我会承认这个错误。 ?
    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2013-08-16
    • 2019-04-16
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多