当前位置: 首页 > 知识库问答 >
问题:

如何修复:无法解析 Json 数组。“不是基元数组”错误

包唯
2023-03-14

我无法通过json数组进行解析。当我试图得到一个“不是原始数组错误。你能帮我找到我的错误吗?”?

我一直在寻找解决办法,但没有找到。

这是我的代码:

    public void tableInit() throws JSONException {
        Log.e("TableInit()", "Start!");
        Log.e("TableInit()", ""+jsonObjectToTable);
        float textSize = 18.0f;
        TableLayout stk = (TableLayout) findViewById(R.id.table_main);
        TableRow tbrow0 = new TableRow(this);

        TextView tv0 = new TextView(this);
        tv0.setText(" ID ");
        tv0.setTypeface(null, Typeface.BOLD); //fett
        tv0.setTextSize(textSize);
        tbrow0.addView(tv0);

       [...]

        stk.addView(tbrow0);


        JSONArray jsonArray = new JSONArray(jsonObjectToTable);

        for(int i = 0; i < jsonArray.length(); ++i)
        {
            // Extract values from JSON row:
            JSONObject jsonObject      = jsonArray.getJSONObject(i);
            Log.e("JsonObject", ""+jsonObject);
            String     id     = jsonObject.has("id")     ? jsonObject.getString("id") : "";
            String     name    = jsonObject.has("name")    ? jsonObject.getString("name") : "";
            String     home = jsonObject.has("home") ? jsonObject.getString("home") : "";
            String     wetsuit     = html" target="_blank">jsonObject.has("wetsuit")     ? jsonObject.getString("wetsuit") : "";
            String     board     = jsonObject.has("board")     ? jsonObject.getString("board") : "";
            String     rig     = jsonObject.has("rig")     ? jsonObject.getString("rig") : "";
            String     harness     = jsonObject.has("harness")     ? jsonObject.getString("harness") : "";
            String     rent_until     = jsonObject.has("rent_until")     ? jsonObject.getString("rent_until") : "";
            String     renting_date     = jsonObject.has("renting_date")     ? jsonObject.getString("renting_date") : "";

            TableRow tbrow = new TableRow(this);

            TextView textViewId = new TextView(this);
            textViewId.setText(id);
            textViewId.setGravity(Gravity.CENTER);
            tbrow.addView(textViewId);

            [...]
        }

    }

下面是创建的 json 对象表:

        @Override
        protected String doInBackground(String... strings) {
            Log.e("Async", "Async starts!");
            try {
                response = RequestHandler.sendGet("http://192.168.122.1/php/renting_private_select.php");
                return response;

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        protected void onPostExecute(String s) {
            try {
                JSONObject tableJson = new JSONObject(s);
                jsonObjectToTable = tableJson;
                tableInit();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }
}

我得到以下日志

E/TableInit():开始!E/TableInit():{"equipment_private":[{"id":"1","name":"Name","home":"Unterkunft","潜水服":"Anzug","board":"Board","rig":"Segel","harness":"Trapetz","renting_date":"23.01.19","rent_until":"23.12.19"},{"id":"2","name":"Name","home":"Unterkunft","潜水服":"Anzug","board":"Board","rig":"Segel","harness":"Trapetz2","renting_date":","rent_until":""}]} W/InternalHandler.handleMessage:AsyncTask.java:712:不是原始数组: classorg.json.JSONObjectW/System.err: atorg.json.JSONArray.(JSONArray.java:116)atcom.example.surftest.MainActivity.tableInit(MainActivity.java:135)W/System.err: atcom.example.surftest.MainActivity$RequestSelectAsync.onPostExecute(MainActivity.java:234)atcom.example.surftest.MainActivity$RequestSelectAsync.onPostExecute)atandroid.os.AsyncTask.finish(AsyncTask.java:695)atandroid.os.AsyncTask.access600$(AsyncTask.java:180)atandroid.os.AsyncTask$System.err(org.json.JSONExceptionandroid.os.Handler.dispatchMessage(Handler.java:106)在android.os.Looper.loop(Looper.java:193)在android.app.ActivityThread.main(ActivityThread.java:6669)在java.lang.reflect.Method.invoke(本机方法)W/System.err:在com. android. interals. os. ZygoteInit. main(ZygoteInit. java: 858)com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit. java: 493)

共有3个答案

陈弘厚
2023-03-14

你的整体解析方式不太对。

为此,我建议使用GSON之类的东西。

要使用它,首先创建两个模型类。

class Response{

@SerializedName("equipment_private")
public List<Equipment> equipmentPrivate

} 

class Equipment {

public String id;

public String name;

public String home;

public String wetsuit;

public String board;

public String rig;

public String harness;

@SerializedName("renting_date")
public String rentingDate;

@SerializedName("rent_until")
public String rentUntil;

}

之后,你可以做这样的事情

 Gson gson = new Gson();
 Response response = gson.fromJson(json_string, Response.class);

也许它需要一些额外的工作,因为我没有在IDE中检查它,但我想你会理解的。希望它会有所帮助。

陶智
2023-03-14

这是因为您获得的表本身就是一个对象。看看这个。您只需多写一行即可完成代码:

这是您的输入

{
  "equipment_private": [{
    "id": "1",
    "name": "Name",
    "home": "Unterkunft",
    "wetsuit": "Anzug",
    "board": "Board",
    "rig": "Segel",
    "harness": "Trapetz",
    "renting_date": "23.01.19",
    "rent_until": "23.12.19"
  }, {
    "id": "2",
    "name": "Name",
    "home": "Unterkunft",
    "wetsuit": "Anzug",
    "board": "Board",
    "rig": "Segel",
    "harness": "Trapetz2",
    "renting_date": "",
    "rent_until": ""
  }]
}
庄经国
2023-03-14

你做错的是,你正在创建json数组的对象并传递json对象本身,而在你的json响应中,json数组被嵌入到与键“equipment_private”相关的json对象中。< br >错误方式:< br > < code > JSON array JSON array = new JSON array(jsonObjectToTable);
正确方法:< br > < code > JSON array JSON array = jsonobjecttotable . getjson array(" equipment _ private ") < br >希望您能理解,这将解决您的问题。

 类似资料:
  • 问题内容: 我正在使用Sencha Touch(ExtJS)从服务器获取JSON消息。我收到的消息是这个: 我的问题是我无法解析此JSON对象,因此我可以使用每个计数器对象。 我正在尝试像这样完成: 我究竟做错了什么 ?谢谢! 问题答案: Javascript具有针对字符串的内置JSON解析,我想这就是您拥有的: 在您的示例中使用此代码将是: 编辑 :for循环的使用中有一个错误(我在初读时就错过

  • 我很难找到解析JSONArray的方法。看起来是这样的: 如果JSON的编写方式不同(换句话说,如果返回的是JSON对象而不是对象数组),我知道如何解析它。但这是我所拥有的一切,我必须要去做。 *编辑:这是一个有效的json。我用这个json做了一个iPhone的应用程序,现在我需要为Android做,但无法解决这个问题。外面有很多例子,但它们都是与JSONObject相关的。我需要一些用于JSO

  • 问题内容: 我有这个json数组: 我有这个类来保存数据: 我正在尝试将json转换为MapData对象的列表: 但是我得到这个错误: 我究竟做错了什么? 问题答案: 我怀疑方法调用返回错误的类型。它应该返回而不是。 就像是: 在这个要点中,我有一个很好的例子说明了您的问题

  • 问题内容: 我正在尝试解析如下的JSON 到[[“ Jack”,“ Jones”,“ Rock”,“ Taylor”,“ Rob”],[“ Rose”,“ John”],[“ Ted”]]的数组 这是数组的数组。 我尝试了下面的代码 当我打印“人”时,我得到o / p为 我很困惑当“人物”重复3次时如何解析 尝试在UITableView中显示内容,其中第一个单元格具有“ Jack” ..“ Rob

  • 问题内容: 如何解析JSON ARRAY以获取没有[]和“”的数据 这是json 我的代码: 输出:[“ 23,Damansara-蒲种高速公路(Bandar Puchong Jaya)”,“ 47100 Puchong Batu Dua Belas,雪兰莪,”马来西亚“] 我只想要数据。如: 23,Damansara-Puchong Hwy(Bandar Puchong Jaya),47100

  • 问题内容: 我有类似以下的输出: 我想获取每个城市的名称,该怎么办? 编辑: 上面的方法似乎无效,没有输出任何值。 问题答案: 也会在提取后为您解析JSON,因此从那时起,您将使用简单的Javascript数组(在JSON中标记为数组)。该文档还包含有关如何处理获取的数据的示例。 您可以使用for循环获取数组中的所有值: 检查您的控制台以查看输出(Chrome,Firefox / Firebug