【问题标题】:Android parse JsonArray of strings don't workAndroid解析字符串的JsonArray不起作用
【发布时间】:2015-06-30 01:10:04
【问题描述】:

我有这个解析器:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            Log.d(TAG, response.toString());

            try {
                // Parsing json object response
                // response will be a json object










                ArrayList<String> listdata = new ArrayList<String>();

                JSONArray configJsonArray = response.getJSONArray("horaires");
                for(int configIterator = 0; configIterator < configJsonArray.length(); configIterator++){



                    Horaires horaires = new Horaires();
                    JSONObject innerConfigObj = configJsonArray.getJSONObject(configIterator);
                     configGrade = innerConfigObj.getString("heure");
                    horaires.setHeure(configGrade);
                    listdata.clear();

                    JSONArray jr = configJsonArray.getJSONObject(configIterator).getJSONArray("passages");





                    for(int v = 0; v < jr.length(); v++){




                        listdata.add(jr.getString(v));
                        horaires.setPassages(listdata);
                    }


                    horairesList.add(horaires);

                }












            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(),
                        "Error: " + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            }
            adapter.notifyDataSetChanged();

        }


    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_SHORT).show();
            // hide the progress dialog

        }
    });

我希望他解析这种类型的 Json:

{"arret":{"codeArret":"BRTA1","libelle":"Bretagne","accessible":true},"ligne":{"numLigne":"3","directionSens1":"Marcel Paul","directionSens2":"Neustrie","accessible":true,"etatTrafic":1,"libelleTrafic":"Service normal"},"codeCouleur":"J","plageDeService":"Des horaires adapt\u00e9s aux rythmes de vos journ\u00e9es\r\nEn p\u00e9riode scolaire...\r\nJour rose : du lundi au vendredi (hors 10 mai).\r\nJour vert : les samedis.\r\nJour bleu : les dimanches et jours f\u00e9ri\u00e9s (aucun service le 1er mai).\r\nPendant les vacances scolaires...\r\nJour jaune : du lundi au vendredi (hors vacances de Toussaint).","horaires":[{"heure":"5h","passages":["14","34","54"]},{"heure":"6h","passages":["12","21","31","40","49","58"]},{"heure":"7h","passages":["05","12","19","26","33","40","46","53"]},{"heure":"8h","passages":["00","07","14","21","28","35","42","49","56"]},{"heure":"9h","passages":["03","10","17","23","30","37","44","51","58"]},{"heure":"10h","passages":["05","12","19","26","33","40","47","54"]},{"heure":"11h","passages":["01","08","15","22","29","36","43","50","57"]},{"heure":"12h","passages":["04","11","17","24","31","37","44","53"]},{"heure":"13h","passages":["00","06","13","19","25","31","37","43","49","55"]},{"heure":"14h","passages":["01","07","13","19","25","31","37","43","49","55"]},{"heure":"15h","passages":["01","07","13","19","25","30","36","42","48","54"]},{"heure":"16h","passages":["00","06","12","18","24","30","36","42","48","54"]},{"heure":"17h","passages":["00","06","13","19","25","31","37","43","49","54"]},{"heure":"18h","passages":["00","06","12","18","24","30","36","42","48","54"]},{"heure":"19h","passages":["00","06","12","19","26","33","39","43","49","54"]},{"heure":"20h","passages":["01","09","13","21","30","39","43","52"]},{"heure":"21h","passages":["01","10","20","30","40","50"]},{"heure":"22h","passages":["00","10","20","32","42"]},{"heure":"23h","passages":["02","32"]},{"heure":"0h","passages":["02","32"]}],"prochainsHoraires":[{"heure":"22h","passages":["00"]},{"heure":"22h","passages":["10"]}]}

但它在列表的每一行都给了我查看相同的段落数据,所以如果有人知道如何解决这个问题,他会非常好!谢谢!

【问题讨论】:

  • 使用 GSON 并创建一个只读“horaires”的类
  • 这不是我剪掉的所有代码!我使用 volley 效果很好,我不想只为 horaires 创建另一个课程,因为时间的解析已经很好了:/
  • 创建新的 listdata 不要使用 listdata.clear();

标签: android json list parsing object


【解决方案1】:

您只需编写几行代码即可轻松解析 json。请在下面找到我为将数据从您的 json 获取到下面定义的数据结构所做的代码:

public class JsonDataVo {
    String codeArret;
    String libelle;
    boolean accessible;
    int numLigne;
    String directionSens1;
    String directionSens2;
    boolean ligneAccessible;
    int etatTrafic;
    String libelleTrafic;
    String codeCouleur;
    String plageDeService;
    ArrayList<HeureDataVO> horaires = new ArrayList<HeureDataVO>();
    ArrayList<HeureDataVO> prochainsHoraires = new ArrayList<HeureDataVO>();

    public String getCodeArret() {
        return codeArret;
    }
    public void setCodeArret(String codeArret) {
        this.codeArret = codeArret;
    }
    public String getLibelle() {
        return libelle;
    }
    public void setLibelle(String libelle) {
        this.libelle = libelle;
    }
    public  boolean getAccessible() {
        return accessible;
    }
    public void setAccessible(  boolean accessible) {
        this.accessible = accessible;
    }
    public int getNumLigne() {
        return numLigne;
    }
    public void setNumLigne(int numLigne) {
        this.numLigne = numLigne;
    }
    public String getDirectionSens1() {
        return directionSens1;
    }
    public void setDirectionSens1(String directionSens1) {
        this.directionSens1 = directionSens1;
    }
    public String getDirectionSens2() {
        return directionSens2;
    }
    public void setDirectionSens2(String directionSens2) {
        this.directionSens2 = directionSens2;
    }
    public boolean isLigneAccessible() {
        return ligneAccessible;
    }
    public void setLigneAccessible(boolean ligneAccessible) {
        this.ligneAccessible = ligneAccessible;
    }
    public int getEtatTrafic() {
        return etatTrafic;
    }
    public void setEtatTrafic(int etatTrafic) {
        this.etatTrafic = etatTrafic;
    }
    public String getLibelleTrafic() {
        return libelleTrafic;
    }
    public void setLibelleTrafic(String libelleTrafic) {
        this.libelleTrafic = libelleTrafic;
    }
    public String getCodeCouleur() {
        return codeCouleur;
    }
    public void setCodeCouleur(String codeCouleur) {
        this.codeCouleur = codeCouleur;
    }
    public String getPlageDeService() {
        return plageDeService;
    }
    public void setPlageDeService(String plageDeService) {
        this.plageDeService = plageDeService;
    }
    public ArrayList<HeureDataVO> getHoraires() {
        return horaires;
    }
    public void setHoraires(ArrayList<HeureDataVO> horaires) {
        this.horaires = horaires;
    }
    public ArrayList<HeureDataVO> getProchainsHoraires() {
        return prochainsHoraires;
    }
    public void setProchainsHoraires(ArrayList<HeureDataVO> prochainsHoraires) {
        this.prochainsHoraires = prochainsHoraires;
    }

}

public class HeureDataVO {
    String heure;
    ArrayList<Integer> passages = new ArrayList<Integer>();

    public String getHeure() {
        return heure;
    }
    public void setHeure(String heure) {
        this.heure = heure;
    }
    public ArrayList<Integer> getPassages() {
        return passages;
    }
    public void setPassages(ArrayList<Integer> passages) {
        this.passages = passages;
    }
}

public ArrayList<Integer> getPassages(JSONObject jsonObj){
         ArrayList<Integer> tmpValues = new ArrayList<Integer>();
        try {
            JSONArray arrayOfValues = jsonObj.getJSONArray("passages");
            for(int i = 0; i < arrayOfValues.length(); i++){
                tmpValues.add(arrayOfValues.getInt(i));
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return tmpValues;
    }

public JsonDataVo parseJson(JSONObject response){
        JsonDataVo jsonDataVo = new JsonDataVo();
        try {
            JSONObject arretobj = response.getJSONObject("arret");
            jsonDataVo.setCodeArret(arretobj.getString("codeArret"));
            jsonDataVo.setLibelle(arretobj.getString("libelle"));
            jsonDataVo.setAccessible(arretobj.getBoolean("accessible"));
            JSONObject lingeObject = response.getJSONObject("ligne");
            jsonDataVo.setNumLigne(lingeObject.getInt("numLigne"));
            jsonDataVo.setDirectionSens1(lingeObject.getString("directionSens1"));
            jsonDataVo.setDirectionSens2(lingeObject.getString("directionSens2"));
            jsonDataVo.setLigneAccessible(lingeObject.getBoolean("accessible"));
            jsonDataVo.setEtatTrafic(lingeObject.getInt("etatTrafic"));
            jsonDataVo.setLibelleTrafic(lingeObject.getString("libelleTrafic"));
            jsonDataVo.setCodeCouleur(response.getString("codeCouleur"));
            jsonDataVo.setPlageDeService(response.getString("plageDeService"));
            JSONArray horairesArray = response.getJSONArray("horaires");
            for(int i = 0; i < horairesArray.length(); i++){

                JSONObject horairesJsonObject = horairesArray.getJSONObject(i);
                   HeureDataVO tmp = new HeureDataVO();
                   tmp.setHeure(horairesJsonObject.getString("heure"));
                   tmp.setPassages(getPassages(horairesJsonObject));
                   jsonDataVo.getHoraires().add(tmp);
            }

            JSONArray prochainsHorairesArray = response.getJSONArray("horaires");
            for(int i = 0; i < prochainsHorairesArray.length(); i++){

                JSONObject horairesJsonObject = prochainsHorairesArray.getJSONObject(i);
                   HeureDataVO tmp = new HeureDataVO();
                   tmp.setHeure(horairesJsonObject.getString("heure"));
                   tmp.setPassages(getPassages(horairesJsonObject));
                   jsonDataVo.getProchainsHoraires().add(tmp);
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jsonDataVo;
    }

我希望这将帮助您获得所需的解决方案,并且您不需要任何库来解析 json。

【讨论】:

    【解决方案2】:

    更改:ArrayList&lt;String&gt; listdata = new ArrayList&lt;String&gt;();List&lt;Horaires&gt; listdata = new ArrayList&lt;Horaires&gt;();

    【讨论】:

      【解决方案3】:

      使用 gson 库(它是 google 库),它是解析任何 jsonObject 的最佳方式和更轻松。 Gson 是一个 Java 库,可用于将 Java 对象转换为其 JSON 表示形式。它还可用于将 JSON 字符串转换为等效的 Java 对象。 Gson 可以处理任意 Java 对象,包括您没有源代码的预先存在的对象。

      https://code.google.com/p/google-gson/ 要么 https://github.com/google/gson

      示例:

      Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)
      

      【讨论】:

      • 请查看问题的第一条和第二条评论
      • 我在这些 cmets 之前回答了或者我没有看到它......但是。我给了他在哪里可以找到 gson 以及谁可以使用它...
      猜你喜欢
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2019-01-18
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 2017-08-13
      相关资源
      最近更新 更多