如何解决:无法解析Json Array。 “不是原始数组”错误

时间:2019-09-02 14:33:27

标签: java android arrays json

我无法解析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     = 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);

            [...]
        }

    }

这是创建的jsonObjectToTable:

        @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“,” wetsuit“:” Anzug“,” board“:” Board“,” rig“:” Segel“, “ harness”:“ Trapetz”,“ renting_date”:“ 23.01.19”,“ rent_until”:“ 23.12.19”},{“ id”:“ 2”,“ name”:“ Name”,“ home”: “ Unterkunft”,“潜水衣”:“ Anzug”,“板”:“板”,“钻机”:“ Segel”,“线束”:“ Trapetz2”,“ renting_date”:“”,“ rent_until”:“”} ]}   W / System.err:org.json.JSONException:不是原始数组:类org.json.JSONObject       W / System.err:位于org.json.JSONArray。(JSONArray.java:116)           在com.example.surftest.MainActivity.tableInit(MainActivity.java:135)   W / System.err:位于com.example.surftest.MainActivity $ RequestSelectAsync.onPostExecute(MainActivity.java:234)           在com.example.surftest.MainActivity $ RequestSelectAsync.onPostExecute(MainActivity.java:213)           在android.os.AsyncTask.finish(AsyncTask.java:695)           在android.os.AsyncTask.access $ 600(AsyncTask.java:180)           在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:712)       W / System.err:位于android.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.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

3 个答案:

答案 0 :(得分:0)

您的整体解析方式不太正确。

出于这种目的,我建议像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中进行检查,因此可能需要一些额外的工作,但我想您会理解的。希望对您有所帮助。

答案 1 :(得分:0)

您做错了什么是创建json数组的对象并传递json对象本身,而在json响应中,json数组被嵌入与键“ equipment_private”相关的json对象中。
错误的方式:
JSONArray jsonArray = new JSONArray(jsonObjectToTable);
正确方法:
JSONArray jsonArray = jsonObjectToTable.getJSONArray("equipment_private")
希望您能理解,并且可以解决您的问题。

答案 2 :(得分:0)

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

这是您的输入内容

{
  "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": ""
  }]
}

因此,您应该按如下方式进行解析:

JSONObject object = new JSONObject(jsonObjectToTable);  // You do need this line
try {
  object.get("equipment_private");


  JSONArray jsonArray = new JSONArray(object);

  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 = 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);

    [...]
  }


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

现在,让我知道您是否遇到任何错误

此外,您可以通过创建代表您的Json对象的类来解决问题,然后使用GSON转换器解析它而无需编写任何这些代码。您可以在此线程How to parse json parsing Using GSON in android

中找到示例解决方案