Java:Org.JSON库写入不一致的数据类型



我在JSON文件中读写了一组数值——它们在Java中都是"double"数据类型。示例如下:

double length = 22.4
double height = 13.1
double width = 17.9
double mass = 15.0

然后,一个名为"objects"的JSONArray将包含JSONObject,每个JSONObject都将包含上述测量值。使用与上面相同的值,它将看起来像这样(注意数据类型(:

"objects" : 
[
{
"length" : 22.4,
"width" : 17.9,
"height" : 13.1,
"mass" : 15
}
]

此类文档带来的第一个问题是,读取"length"、"width"one_answers"height"将返回数据类型"BigDecimal",这对于我所知只返回double和integer的org.json库来说似乎不正常。这是一个问题,因为我需要将"BigDecimal"值转换回double,尽管我使用标准的java double值编写JSON对象。此外,org.json库在读取时似乎会将任何"double"数据类型转换为整数(注意质量是"15"而不是"15.0"吗?这是一个问题,因为正如你可能知道的,"mass"的数值可能与另一个JSONObject不同(因此确实是double(。你可能可以想象,当随机值是整数时,它会迭代这个JSONArray。。。

总之,我的问题是,使用org.JSON库读取JSON文件意味着数值只能作为doubles或BigDecimals返回。我的问题是,我是否可以指定我希望org.json编写的数据类型我只想把我所有的数值读写成一个双精度-我不想让org.json选择它将写入json文件的数据类型

我的想法如下:

  • 将所有内容都写为字符串,并在读取时转换回双精度

我解决这个问题的尝试没有奏效,或者对我来说是多余的:

  • 使用valueOf方法在数据类型之间进行更改
  • 编写9999个条件以找到合适的实例并将其转换回double(这很糟糕(
  • 使用doubleValue((方法

我想要的只是将我的所有数值读写为双精度-我不希望org.json选择它将写入json文件的数据类型。

值得注意的是,JSON库没有选择数据类型。它是选择基于字符的表示来表达一个值。它做它正在做的事情有一些合乎逻辑的理由。JSON是(或者至少起源于(Javascript的一个子集。在Javascript中,整数和浮点不是不同的类型。在Javascript中,所有数字只有一种基本数据类型

我不认为使用org.json代码可以解决这个问题。在静态JSONObject::numberToString中,小数点后的尾随零被剥离。由于它是一个静态方法,所以不能在子类中重写它。

(看看源代码。(

我的建议:

  1. 使用当前行为。例如,您的代码可以编写为知道哪些字段应该具有浮点值,并使用doubleValue()检索它们的值。

  2. 找到一个不执行此操作的替代JSON库。(根据我对代码的阅读,我认为Jackson会没事的。我没有检查过任何其他库…(

  3. 您可以创建自己的org.json库的private分支并对其进行修改,但随后您将面临无限期维护该分支的开销。

我认为3是个坏主意。我只是为了完整起见才把它包括在内。

最新更新