解析一些未加引号(无效)的JSON时,JSONArray(String json)返回“Infinite”

时间:2014-05-15 14:15:01

标签: java android json

好奇心:

JSONArray rfidArray1 = new JSONArray("[047c04fae63684]");

返回JSONArray,其第一个值为Double,其值为Infinity,而:

JSONArray rfidArray1 = new JSONArray("[04b2b6f2443680]");

返回JSONArray,其第一个值为String,其值为04b2b6f2443680

这显然是无效的JSON,应该抛出JSONException,但它偶尔会返回破坏的值。它似乎对某些值很宽松,并返回一个“正确的”JSONArray,但与其他一些它没有。以下是一些更多的值:

返回Double的第一个值,其值为Infinity

"[047c04fae63684]"
"[042579FAE63680]"
"[048C22FAE63684]"
"[049360FAE63680]"

返回具有“正确”值的String的第一个值:

"[04bb97d27c3680]"
"[04BB97D27C3680]"
"[04337FF2443681]"
"[04b2b6f2443680]"
"[0447E3FAE63680]"
"[\"047c04fae63684\"]"
"[\"049360FAE63680\"]"

我使用的是Android 4.4.2 API级别19。

1 个答案:

答案 0 :(得分:3)

你的双倍'值包含字母E,它是有效的双重语法,如果解析器识别为十六进制,JSONArray可能会执行。 E在浮点世界中表示为times 10 to the power of

numbers1[E/e]numbers2被解析为:

numbers1 * (10 ^ numbers2)

numbers1 times 10 to the power of numbers2

其中数字[1/2]表示十六进制数字的任意组合。 SOOO ....

047c04fae63684

相同

047c04fa * (10 ^ 64684)并且double没有足够的数据空间来容纳该指数,因此它会溢出并返回Infinity

同时JSONArray解析器不知道"[04b2b6f2443680]"的内容,因此我认为它假定因为它包含非数字,所以它必须是一个字符串,并将其作为{{1 }}

对于String,您将数组值括在引号中,以便解析器自动查看它们并说“嘿,这就是一个字符串,让我们只返回那个'并且没有做任何其他事情。

很抱歉,如果数据不准确,我的头脑很冷。