【问题标题】:Convert Json Array to normal Java list将 Json Array 转换为普通 Java 列表
【发布时间】:2011-03-24 16:03:46
【问题描述】:

有没有办法将 JSON Array 转换为普通的 Java Array 用于 android ListView 数据绑定?

【问题讨论】:

  • 有趣的是org.JSONArray在底层使用了一个ArrayList...The arrayList where the JSONArray's properties are kept,所以大多数循环在很多情况下都是徒劳的(只是为了封装)

标签: java android json


【解决方案1】:
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 

【讨论】:

  • for 循环缺少右括号...尝试编辑,但字符数不足以通过批准。那好吧!仅供参考。
  • itz 实际上并没有丢失,回答者只是粘贴了一段带有函数的打开和关闭大括号的代码。
  • 如果jsonArray.get(i) 返回 null 会发生什么(作为解析结果:[ "String 1", null, "String 2" ])?那你的for循环不会崩溃吗?
  • 谢谢。如果有 sring 那么 JSONArray 可以创建为 JSONArray jsonArray = new JSONArray (yourString);其余代码将保持不变。
  • 根据具体实现,您可能需要size() 而不是length()
【解决方案2】:

如果您还没有 JSONArray 对象,请调用

JSONArray jsonArray = new JSONArray(jsonArrayString);

然后简单地循环,构建你自己的数组。这段代码假定它是一个字符串数组,它应该不难修改以适合您的特定数组结构。

List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
}

【讨论】:

  • 对不起,你是对的 - 我将 Lists 与 JSONArrays 混淆了 :) 它确实是 JSONArray.length()。
【解决方案3】:

不要使用捆绑的org.json 库,而是尝试使用Jackson 或GSON,这是一个单行。与杰克逊,前任:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);

【讨论】:

    【解决方案4】:

    也许这只是一种解决方法(不是很有效),但您可以这样做:

    String[] resultingArray = yourJSONarray.join(",").split(",");

    显然你可以用任何你喜欢的东西来改变','分隔符(我有一个JSONArray的电子邮件地址)

    【讨论】:

    • 请注意,您必须绝对确定数据不包含您的分隔符,否则您将得到损坏的数据。
    • 结果必须是字符串。
    【解决方案5】:

    使用 Java 流,您可以使用 IntStream 映射对象:

    JSONArray array = new JSONArray(jsonString);
    List<String> result = IntStream.range(0, array.length())
            .mapToObj(array::get)
            .map(Object::toString)
            .collect(Collectors.toList());
    

    【讨论】:

      【解决方案6】:

      使用可以使用String[] 而不是ArrayList&lt;String&gt;

      它将减少 ArrayList 的内存开销

      希望对你有帮助!

      String[] stringsArray = new String[jsonArray.length()];
      for (int i = 0; i < jsonArray.length; i++) {
          parametersArray[i] = parametersJSONArray.getString(i);
      }
      

      【讨论】:

        【解决方案7】:

        我知道这个问题是关于 JSONArray 的,但我发现这里的示例很有用,您不需要使用 JSONArray 从 JSONObject 中提取对象。

        import org.json.simple.JSONObject;
        import org.json.simple.JSONValue;
        
        String jsonStr = "{\"types\":[1, 2]}";
        JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
        List<Long> list = (List<Long>) json.get("types");
        if (list != null) {
            for (Long s : list) {
                System.out.println(s);
            }
        }
        

        也适用于字符串数组

        【讨论】:

          【解决方案8】:

          这是一种更好的方法:如果您从 API 获取数据。然后解析 JSON 并将其加载到您的列表视图中:

          protected void onPostExecute(String result) {
                          Log.v(TAG + " result);
          
          
                          if (!result.equals("")) {
          
                              // Set up variables for API Call
                              ArrayList<String> list = new ArrayList<String>();
          
                              try {
                                  JSONArray jsonArray = new JSONArray(result);
          
                                  for (int i = 0; i < jsonArray.length(); i++) {
          
                                      list.add(jsonArray.get(i).toString());
          
                                  }//end for
                              } catch (JSONException e) {
                                  Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                                  e.printStackTrace();
                              }
          
          
                              adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                              listView.setAdapter(adapter);
                              listView.setOnItemClickListener(new OnItemClickListener() {
                                  @Override
                                  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          
                                      // ListView Clicked item index
                                      int itemPosition = position;
          
                                      // ListView Clicked item value
                                      String itemValue = (String) listView.getItemAtPosition(position);
          
                                      // Show Alert
                                      Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                                  }
                              });
          
                              adapter.notifyDataSetChanged();
          
          
                                  adapter.notifyDataSetChanged();
          
          ...
          

          【讨论】:

            【解决方案9】:

            我们从转换开始[ JSONArray -> List ]

            public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
                    throws JSONException {
              ArrayList<JSONObject> jsonObjects = new ArrayList<>();
              for (int i = 0; 
                       i < (array != null ? array.length() : 0);           
                       jsonObjects.add(array.getJSONObject(i++)) 
                   );
              return jsonObjects;
            }
            

            接下来创建通用版本,用 POJO 替换 array.getJSONObject(i++)

            示例:

            public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
                    throws JSONException {
              ArrayList<Tt> tObjects = new ArrayList<>();
              for (int i = 0; 
                       i < (array != null ? array.length() : 0);           
                       tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
                   );
              return tObjects;
            }
            
            private static T createT(Class<T> forCLass, JSONObject jObject) {
               // instantiate via reflection / use constructor or whatsoever 
               T tObject = forClass.newInstance(); 
               // if not using constuctor args  fill up 
               // 
               // return new pojo filled object 
               return tObject;
            }
            

            【讨论】:

              【解决方案10】:

              您可以使用String[] 代替ArrayList&lt;String&gt;

              希望对你有帮助!

                 private String[] getStringArray(JSONArray jsonArray) throws JSONException {
                          if (jsonArray != null) {
                              String[] stringsArray = new String[jsonArray.length()];
                              for (int i = 0; i < jsonArray.length(); i++) {
                                  stringsArray[i] = jsonArray.getString(i);
                              }
                              return stringsArray;
                          } else
                              return null;
                      }
              

              【讨论】:

                【解决方案11】:

                我们可以简单地将JSON转换成可读的字符串,并使用String类的“split”方法进行拆分。

                String jsonAsString = yourJsonArray.toString();
                //we need to remove the leading and the ending quotes and square brackets
                jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
                //split wherever the String contains ","
                String[] jsonAsStringArray = jsonAsString.split("\",\"");
                

                【讨论】:

                  【解决方案12】:

                  改进 Pentium10s Post:

                  我只是使用 foreach 循环将 JSON 数组的元素放入列表中。这样代码就更清晰了。

                  ArrayList<String> list = new ArrayList<String>();
                  JSONArray jsonArray = (JSONArray)jsonObject;
                  jsonArray.forEach(element -> list.add(element.toString());
                  

                  【讨论】:

                    【解决方案13】:
                    private String[] getStringArray(JSONArray jsonArray) throws JSONException {
                        if (jsonArray != null) {
                            String[] stringsArray = new String[jsonArray.length()];
                            for (int i = 0; i < jsonArray.length(); i++) {
                                stringsArray[i] = jsonArray.getString(i);
                            }
                            return stringsArray;
                        } else
                            return null;
                    }
                    

                    【讨论】:

                      【解决方案14】:

                      你可以使用迭代器:

                      JSONArray exportList = (JSONArray)response.get("exports");
                      Iterator i = exportList.iterator();
                      while (i.hasNext()) {
                            JSONObject export = (JSONObject) i.next();
                            String name = (String)export.get("name");
                      }
                      

                      【讨论】:

                        【解决方案15】:

                        我知道问题是针对Java。但我想为Kotlin 分享一个可能的解决方案,因为我认为它很有用。

                        使用 Kotlin,您可以编写一个扩展函数,将 JSONArray 转换为原生 (Kotlin) 数组:

                        fun JSONArray.asArray(): Array<Any> {
                            return Array(this.length()) { this[it] }
                        }
                        

                        现在您可以直接在 JSONArray 实例上调用 asArray()

                        【讨论】:

                          【解决方案16】:

                          使用 java.util.Arrays 怎么样?

                          List<String> list = Arrays.asList((String[])jsonArray.toArray())
                          

                          【讨论】:

                          • 我在 JSONArray() 文档中没有看到 toArray() 方法。 json.org/javadoc/org/json/JSONArray.html如果有简单的toArray(),这个问题可能不会被问到。
                          • net.sf.json.JSONArray 具有 toArray() 方法,因此此响应适用于此 JSON 库。该问题未指定使用的库。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-08-25
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多