好奇心:
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。
答案 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
,您将数组值括在引号中,以便解析器自动查看它们并说“嘿,这就是一个字符串,让我们只返回那个'并且没有做任何其他事情。
很抱歉,如果数据不准确,我的头脑很冷。