【问题标题】:Can't understand JsonMappingException无法理解 JsonMappingException
【发布时间】:2018-04-20 05:06:38
【问题描述】:

运行以下行时:

Request<Map<String, Object>> requestMap = JsonUtils.fromJson(eventContext.getMessage().getPayloadAsString(), Request.class);

我得到了这个 Java 异常:

Root Exception stack trace:
org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class ***.objectmodel.Request] from JSON floating-point number; no one-double/Double-arg constructor/factory method

【问题讨论】:

  • 什么是 JSON?
  • 以及 Request.class 中的内容。该错误消息意味着 JSON 解析器遇到了一个它认为是浮点数的值,例如 3.14。它试图将浮点值映射到解析结果中,但找不到“一个双参数”构造函数或工厂方法。

标签: java json mapping


【解决方案1】:

在我看来,您正在尝试将 String (JSON) 转换为请求,但您没有指定您尝试解析的请求类型(通用参数)。

我会尝试将该 JSON 提取到 Map 中,如下所示:

Map<String, Object> actual = JsonUtil.fromJson(encoded, new TypeReference<Map<String, Object>>(){});

一旦你收到一个 JSON 并且想要反序列化它,我相信它有信息并且你必须创建一个特定的实体来映射它,那么它会是这样的:

Map<String, YourEntity> actual = JsonUtil.fromJson(encoded, new TypeReference<Map<String, YourEntity>>(){});

有关此解决方案的更多详细信息,您可以找到here

【讨论】:

  • 好吧,如果它是目标类的反序列化映射问题,这是一个非常好的方法。我在下面的答案中发布了“解决方案”。无论如何,感谢您的 sn-p,它可能会有所帮助。
  • 无论如何,我相信您可以将您的异常作为问题提交给该库的维护者。那个例外在艾伦没有意义......
【解决方案2】:

我在调试时发现了问题。 JSON字符串实际上不是JSON(特别是只有一个IP地址字符串“192.168.1.1”。所以它不是目标类的反序列化映射问题(正如我最初所认为的那样)。

寓言寓意:异常太复杂。 “不是 JSON 字符串”就足够了。

【讨论】:

  • 任何 XXXX 解析器在完成对整个“XXXX 格式”文本的解析之前如何知道“无效的 XXXX 语法”?解析器通常从左到右一次处理一个标记。它可以为您提供的最佳错误是尽可能详细地说明它发生的确切位置。
  • 你是对的,但至少它可以在异常中使用更准确的名称,如 "JsonSyntaxException" 。 (Google JSON 库实际上存在此异常)。
猜你喜欢
  • 2012-03-12
  • 2015-01-13
  • 2016-07-09
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
相关资源
最近更新 更多