【问题标题】:JSONException: Not a primitive array?JSONException:不是原始数组?
【发布时间】:2014-06-02 11:48:47
【问题描述】:

我在从 URL 接收 JSON 数组时遇到问题。我已经验证我的链接没有问题,并且返回了正确的 JSON 数组,它甚至显示在错误消息中。我不确定这意味着什么。

错误:

04-17 21:34:04.435  21842-22217/edu.appdesign.leaguestats W/System.err﹕ org.json.JSONException: Not a primitive array: class org.json.JSONArray
04-17 21:34:04.435  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at org.json.JSONArray.<init>(JSONArray.java)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetSummary.doInBackground(GetStaticData.java:90)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetSummary.doInBackground(GetStaticData.java:76)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
04-17 21:34:04.445  21842-22217/edu.appdesign.leaguestats W/System.err﹕ at java.lang.Thread.run(Thread.java)

代码:

    JSONArray jsonArray = jsonArrayParser.getJSONFromUrl(url2);
    JSONArray leagueArray = new JSONArray(jsonArray);
    summary.rTier = leagueData.getString("tier");
    summary.rLeague = leagueData.getString("leagueName");
    summary.rRank = leagueData.getString("rank");
    summary.rLeaguePoints = leagueData.getString("leaguePoints");

JSON:

[{
   "isHotStreak": false,
   "isFreshBlood": false,
   "leagueName": "Udyr's Lancers",
   "isVeteran": false,
   "tier": "GOLD",
   "lastPlayed": -1,
   "playerOrTeamId": "23591778",
   "leaguePoints": 0,
   "rank": "V",
   "isInactive": false,
   "queueType": "RANKED_SOLO_5x5",
   "playerOrTeamName": "NV43",
   "wins": 83
}]

这一切都是在 AsyncTask 中完成的,所以没有问题。知道是什么原因造成的吗?

【问题讨论】:

  • 查看您尝试获取的 JSON 会很有帮助
  • JSONArray leagueArray = new JSONArray(jsonArray); 看起来很可疑
  • @meda 将 JSON 添加到我的帖子中。
  • @dcharms 你是对的。稍微修改了我的代码,它按预期工作。
  • 很高兴你能弄明白!如果您的数组中有多个对象,我将发布一个关于如何处理此问题的答案。

标签: android arrays json


【解决方案1】:
JSON ArrayResponse
[
{
    "name" : "Ravi Tamada", 
    "email" : "ravi8x@gmail.com",
    "phone" : {
        "home" : "08947 000000",
        "mobile" : "9999999999"
    }
    },
    {
    "name" : "Tommy", 
    "email" : "tommy@gmail.com",
    "phone" : {
        "home" : "08946 000000",
        "mobile" : "0000000000"
    }
    }
]

在JsonArray(response)中通过Volley库得到Response后,不要通过创建New JSonArray来进行Primitive response。

使用以下方法其工作:

JSONObject jsonObject = response.getJSONObject(i);

String name = jsonObject.getString("name");
String email = jsonObject.getString("email");

JSONObject jsonObject2 = jsonObject.getJSONObject("phone");
String home = jsonObject2.getString("home");
String mobile = jsonObject2.getString("mobile");

【讨论】:

    【解决方案2】:

    第二个 JSONArray 指向第一个,所以这样做:

    JSONArray firstArray = (JSONArray) secondArray;
    

    ofc,仅在需要时才投射!

    【讨论】:

      【解决方案3】:

      我有同样的问题。正是因为这一行:

      JSONArray leagueArray = new JSONArray(jsonArray);
      

      您基本上是在创建 2 个不同的 JSONArray,第二个只是指向第一个,但是您不能以这种方式实例化第二个数组,否则会抛出错误。因此你不需要这样做:

      new JSONArray(jsonArray)
      

      只是做:

      leagueArray = jsonArray;
      

      顺便说一句,我认为你的意思是:

      JSONArray jsonArray = jsonArrayParser.getJSONFromUrl(url2);
      JSONObject leagueObject = jsonArray.getJSONObject(0);
      

      您的第一个结果是一个数组(用“[]”表示),但内部子对象是一个对象(用“{}”表示)

      希望这会有所帮助:)

      【讨论】:

        【解决方案4】:

        看起来您正试图拉下一个包含一些对象的 JSONArray。尝试做这样的事情:

        JSONArray jsonArray = jsonArrayParser.getJSONFromUrl(url2);
        for (int i=0; i<jsonArray.length(); i++) {
            JSONObject leagueData = jsonArray.getJSONObject(i);
            String tier = leagueData.getString("tier");
            String leagueName = leagueData.getString("leagueName");
            String rank = leagueData.getString("rank");
            String leaguePoints = leagueData.getString("leaguePoints");
        
            // Whatever you want to do with these fields.
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2020-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多