2014-05-15 66 views
2

甲好奇心:JSONArray(字符串JSON)返回 “无限” 解析一些无引号(无效)JSON当

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

返回JSONArray,其第一值是一个DoubleInfinity值,而:

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

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

这显然是无效的JSON应该抛出一个JSONException,但它零星地返回破碎的值。它似乎对某些值是宽松的,并返回一个“正确”的JSONArray,但是与其他一些值不同。这里有一些更多的价值:中DoubleInfinity

返回第一个值:

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

返回的String与 '适当' 的值第一个值:

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

我使用的Android 4.4.2 API级别19.

+0

如果你这样做会发生什么:'JsonArray json = new JsonArray(); json.put(“047c04fae63684”);' –

+0

我正确地结束了与我做同样的值'JSONArray rfidArray10 = new JSONArray(“[\”047c04fae63684 \“]”);'('''值。) –

回答

3

您的'double'值包含字母E,这是有效的双语法如果解析器识别为hexade cimal,这可能是JSONArrayE装置在浮点世界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)和双没有足够的数据空间来保存该指数,因此它溢出,并返回Infinity

同时,JSONArray解析器不知道如何处理"[04b2b6f2443680]",所以即时geussing它假定,因为它包含非数字,它必须是一个字符串,它返回它作为一个String

对于"[\"049360FAE63680\"]",您将数组值添加到引号中,以便解析器自动查看它们并说'嘿,那是一个字符串,让我们只返回',并且不做任何其他操作。

对不起,如果数据不准确,我头冷了。

+0

令人惊叹!我认为这可能是这样的,但我没有想到“对'的力量。恭喜你有一个熟练解释的答案,谢谢:) –