使用 JSON-Simple (Java) 在 JSON 数据中解析十进制数字,其中一些缺少小数分隔符

Posted

技术标签:

【中文标题】使用 JSON-Simple (Java) 在 JSON 数据中解析十进制数字,其中一些缺少小数分隔符【英文标题】:Parsing decimal numbers, some of which lack a decimal separator, in JSON data using JSON-Simple (Java) 【发布时间】:2019-11-20 22:43:04 【问题描述】:

我正在尝试使用JSON-Simple JSON 处理器库。

解析JSON片段时如:

"speed":1.13

…我打电话给get 并转换为Double。没问题。

Double speed = ( Double ) wind.get( "speed" );

然后我遇到一个没有小数的值。例如:1 而不是 1.0

"speed":1

当然,此数据的发布者应该写为"speed":1.0。但他们没有。

我的 get 带有强制转换抛出异常:

线程“主”java.lang.ClassCastException 中的异常:类 java.lang.Long 无法转换为类 java.lang.Double(java.lang.Long 和 java.lang.Double 在模块 java.base 中)加载程序“引导程序”)

显然JSON-Simple 坚持将1 的JSON 值解析为Long。所以我需要一种解决方法,一种告诉 JSON-Simple 如何解析这个特定元素的方法。

➥ 有没有办法告诉 JSON-Simple 将字符串输入解析为 Double 而不管是否存在 decimal separator(小数点)?

➥ 更好的是,我可以告诉 JSON-Simple 将特定 JSON 元素的字符串输入解析为 BigDecimal 以绕过 floating-point 的 inaccuracy 吗? (也就是说,从StringBigDecimal,一路上不涉及浮点数)

【问题讨论】:

【参考方案1】:

而不是强制转换尝试

Double.parseDouble(wind.get( "speed" ).toString())

【讨论】:

【参考方案2】:

使用更高版本

您使用的是方毅东领导的原始 JSON-Simple 库。后来的版本 2 和 3 是在 GitHub 上的 this Clifton Labs page 上作为分支开发的,由 Davin Loegering 领导。

原版不支持BigDecimal。 The fork 确实支持 BigDecimal。请参阅getBigDecimal 方法。

fork 对原始库进行了相当大的更改。请参阅that Clifton Labs page 的历史部分。

【讨论】:

以上是关于使用 JSON-Simple (Java) 在 JSON 数据中解析十进制数字,其中一些缺少小数分隔符的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot War 中缺少 json-simple.jar

将json-simple添加到类路径后仍然无法解析简单符号[重复]

JSON文件的[读]与[写], 以JSON.SIMPLE 为例

Java 中的漂亮打印 JSON

在猪中使用 AvroStorage()

Java上位机开发(json处理)