【问题标题】:How can create JSON Object and put in JSON Array by for loop in android?如何在android中通过for循环创建JSON对象并放入JSON数组?
【发布时间】:2016-07-09 14:05:56
【问题描述】:

我有一个 JSON 对象,而不是一个 JSON 数组, 我想获取值并创建新的 JSON 对象并再次放入 JSON 数组。

这里我的 JSONObject 叫做 response

{"data":
 [{
    "level":"lv1",
    "name_indo":"Telinga",
    "name_eng":"Ear",
    "detail_indo":"Telinga adalah alat indra yang memiliki fungsi untuk mendengar suara yang ada di sekitar kita.\r\n",
    "detail_eng":"The ear is the sensory apparatus that has a function to hear the sounds that are around us .\r\n",
    "image_url":"\/append_img\/telinga.png”},
{
    “level":"lv1",
    "name_indo":"Gigi",
    "name_eng":"Tooth",
    "detail_indo":"Gigi adalah alat yang digunakan untuk mengolah makanan saat kita makan.\r\n",
    "detail_eng":"Gigi is a tool used to process food when we eat.\r\n",
    "image_url":"\/append_img\/gigi.png"}]
}

这是我的代码,用于制作仅包含 name_eng​​strong> 值和 image_url 值的新 JSON 数组:

                    try {
                    JSONArray resultArr = response.getJSONArray("data");

                    JSONObject filterJson = null;
                    JSONArray filterArr = null;
                    for (int i = 0; i < resultArr.length(); i++) {
                        Log.v(TAG, "run for");
                        JSONObject finalObj = (JSONObject) resultArr.get(i);
                        String name_eng = finalObj.getString("name-eng");
                        filterJson = new JSONObject();
                        filterJson.put("name_eng", name_eng);

                        filterArr = new JSONArray();
                        filterArr.put(filterJson);
                    }
                    JSONObject fixedJSON = new JSONObject();
                    assert filterArr != null;
                    fixedJSON.put("data", filterArr.toString());
                    Log.v(TAG, "filterarray : "+fixedJSON);
                    } catch (JSONException e) {
                     e.printStackTrace();
                    }

这是我的 LogCat 错误:

03-22 23:50:42.864 10867-10867/tk.partofbodyapp.partofbodyapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: tk.partofbodyapp.partofbodyapp, PID: 10867
                                                                            java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONArray org.json.JSONArray.put(java.lang.Object)' on a null object reference
                                                                                at tk.partofbodyapp.partofbodyapp.startgameActivity$startJson.onPostExecute(startgameActivity.java:191)
                                                                                at tk.partofbodyapp.partofbodyapp.startgameActivity$startJson.onPostExecute(startgameActivity.java:88)
                                                                                at android.os.AsyncTask.finish(AsyncTask.java:636)
                                                                                at android.os.AsyncTask.access$500(AsyncTask.java:177)
                                                                                at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                at android.os.Looper.loop(Looper.java:135)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

错误startgameActivity.java:191filterArr.put(filterJson);

我想再次制作一个 JSON 谎言:

{"data":
 [{
    "name_eng":"Ear",
    "image_url":"\/append_img\/telinga.png”},
{
    "name_eng":"Tooth",
    "image_url":"\/append_img\/gigi.png"}]
}

有什么想法吗?

【问题讨论】:

  • 我认为问题出在其他地方。我尝试了JSONObject jsonObject = new JSONObject(yourJson),它抛出了 JsonToken.syntaxError。挖掘了一段时间后,我发现它无法解析 image_url 字段中的“\\/”。可能这就是你得到 NullPointerException 的原因。
  • 必须!你的 json 有问题。 .... "image_url":"\/append_img\/telinga.png [ ” ] }, { [ “ ] level":"lv1", [ ] 中的字符应该是引号 (") 但有所不同。如果将它们更改为引号,它们将很容易解析并且不会抛出空指针。
  • 我试图只得到name_eng,但仍然有同样的问题。我认为这与儿子的结构无关。
  • 我已经尝试过我发布的解决方案,我想这也对你有用。 :) 让我知道是否可以提供更多帮助。

标签: java android arrays json android-studio


【解决方案1】:

试试这个

try {
    JSONArray resultArr = response.getJSONArray("data");
    JSONArray filterArr = new JSONArray();
    for (int i = 0; i < resultArr.length(); i++) {
        Log.v(TAG, "run for");
        JSONObject filterJson = new JSONObject();
        JSONObject finalObj = (JSONObject) resultArr.get(i);
        String name_eng = finalObj.getString("name-eng");
        String image_url = finalObj.getString("image_url");
        filterJson.put("name_eng", name_eng);
        filterJson.put("image_url", image_url);
        filterArr.put(filterJson);
    }
    JSONObject fixedJSON = new JSONObject();
    assert filterArr != null;
    fixedJSON.put("data", filterArr);
    Log.v(TAG, "filterarray : "+fixedJSON);
} catch (JSONException e) {
    e.printStackTrace();
}

【讨论】:

  • filterArr.put(filterJson) aways be nullException
  • AssertNotNull(filterArr)代替assert filterArr != null;再试一次。
  • startgameActivity.java:191 是什么?
  • filterArr.put(filterJson);
【解决方案2】:

好吧,不用担心,这里有一个简单的方法,只需 5 个简单的步骤。

1 : 创建模型 POJO - 仅包含输出 json 中所需的字段。

public class Model2 {

   String name_eng;
   String image_url;

   //Create Getters and Setters

}

2 : 从 json 创建 Json 对象 - 输入是您的 json 字符串

JSONObject jsonObject = new JSONObject(json);

3:获取 JSONArray 并将其转换为对象列表

Type listType = new TypeToken<ArrayList<Model2>>() { }.getType();
List<Model2> outputList = new Gson().fromJson(jsonObject.getJSONArray("data").toString(), listType);

(使用 Gson 将 json 转换为 Object。必须也是使用 JSON 库的好方法)

4 : 创建新的 JSONObject - 发送响应

 JSONObject newJsonObject = new JSONObject();

5:将 outputList 添加到 newJsonObject

newJsonObject.put("data", outputList);

PS : 你的 json 是不可序列化的,直到你做我在评论中对你说的改变。

【讨论】:

    【解决方案3】:

    问题是您每次通过循环都创建一个新的 JSONArray。还要确保您获得了要过滤每个循环迭代的所有信息。

                    try {
                    JSONArray resultArr = response.getJSONArray("data");
    
                    JSONObject filterJson = null;
                    JSONArray filterArr = new JSONArray();
                    for (int i = 0; i < resultArr.length(); i++) {
                        Log.v(TAG, "run for");
                        JSONObject finalObj = (JSONObject) resultArr.get(i);
                        String name_eng = finalObj.getString("name_eng");
                        String image_url = finalObj.getString("image_url");
    
                        filterJson = new JSONObject();
                        filterJson.put("name_eng", name_eng);
                        filterJson.put("image_url", image_url);
    
                        filterArr.put(filterJson);
                    }
                    JSONObject fixedJSON = new JSONObject();
                    assert filterArr != null;
                    fixedJSON.put("data", filterArr.toString());
                    Log.v(TAG, "filterarray : "+fixedJSON);
                    } catch (JSONException e) {
                     e.printStackTrace();
                    }
    

    【讨论】:

    • 我试过这个但没用,filterArr.put(filterJson) 是 nullException
    • 当你说它“不起作用”时,什么不起作用?
    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多