【问题标题】:Why org.json.JSONObject getLong and getString not equal为什么 org.json.JSONObject getLong 和 getString 不相等
【发布时间】:2013-08-21 04:55:50
【问题描述】:

这样的代码:

     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?

【问题讨论】:

  • 你能显示实际内容是什么吗?

标签: android json org.json


【解决方案1】:

根据文档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 时得到的值

【讨论】:

  • @keepcleargas 我认为,这是您收到的值背后的正确原因。
  • 嗯...它的好回答...:)
【解决方案2】:

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

你的新 JSON 看起来像,

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

看看这些examples

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

【讨论】:

  • 谢谢umair.ali,我明白了。
  • @umair.ali:您将无法按照上面的建议进行操作,因为对于 int 而言,该值太大了。您需要先将其转换为 double,然后才能在 JSON 中使用它(原因已在文档中提及)。这就是为什么建议将其作为String 传递的原因。
  • @Rajeev:这可能大于 int...但不是 long,因为 long 的最大值是 9,223,372,036,854,775,807。
  • 是的,但是无论您在哪里形成 JSON,您都需要使用尾随 L 让编译器知道它是 long,否则编译器将尝试解释仅限int。所以在我上面的例子中,我需要使用json.put("test", 3537275240990320342L);
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2023-04-05
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2018-03-18
  • 2013-10-25
相关资源
最近更新 更多