为什么org.json.JSONObject getLong和getString不相等

时间:2013-08-21 04:55:50

标签: android json org.json

这样的代码:

     JSONObject contentObject = new JSONObject(content);
     JSONObject params = contentObject.getJSONObject("response_params");
     Log.d("onTest", "channel_id:" + params.getString("channel_id"));
     Log.d("onTest", "channel_id:" + params.getLong("channel_id"));

日志打印:

   08-21 12:46:21.470: DEBUG/onTest(25228): onMessage: content : {"response_params":{"appid":"1071410","channel_id":"3537275240990320342","user_id":"714893193627619861"},"request_id":1293438498}
   08-21 12:46:21.480: DEBUG/onTest(25228): channel_id:3537275240990320342
   08-21 12:46:21.480: DEBUG/onTest(25228): channel_id:3537275240990320128

为什么getLong的值为3537275240990320128,但是获取值为3537275240990320342的String?

2 个答案:

答案 0 :(得分:5)

根据文档here

public long getLong (String name)
  

返回按名称映射的值(如果存在且长或可以)   被迫了很久。请注意,JSON将数字表示为双精度数,因此   这是有损的;使用字符串通过JSON传输数字。

修改 要亲自看看,你可以这样做

JSONObject json = new JSONObject();
try {
    json.put("test", "3537275240990320342");
    String str = json.getString("test");
    double dou = Double.parseDouble(str);
    long lo = (long) dou;
} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

您会看到lo的价值与您getLong时的价值完全相同

答案 1 :(得分:0)

原因很简单......您的JSON包含channel_id的值作为字符串类型...如果您确定channel_id类型为long ... 删除double引号表单值channel_id

你的新JSON看起来像,

{
    "response_params":
        {
            "appid":"1071410",
            "channel_id":3537275240990320342, // here
            "user_id":"714893193627619861"
        },
    "request_id":1293438498
 }

看看这些examples

希望这会有所帮助......