【问题标题】:Converting JSONarray to ArrayList将 JSONarray 转换为 ArrayList
【发布时间】:2013-06-06 21:40:42
【问题描述】:

我正在下载一个 JSON 字符串并将其转换为 JSONArray。我把它放到一个列表视图中,以后需要能够从该列表视图中删除,并且由于 JSONArray 没有 .remove 方法(感谢奥巴马),我正在尝试将其转换为数组列表。

这是我的 JSON(array.toString()):

[
    {
         "thumb_url":"tb1370913834.jpg",
         "event_id":"15","count":"44",
         "event_tagline":"this is a tagline",
         "event_name":"5th birthday",
         "event_end":"1370919600",
         "event_start":"1370876400"
    }
]

我需要将它放入一个数组中,并能够通过它们各自的键调用字符串。感谢任何帮助!

【问题讨论】:

  • 当您说键时,这是否意味着某种字典(Android 中的地图)?数组将基于索引。看看developer.android.com/reference/java/util/Map.html如何创建和使用。
  • 可以使用地图来填充带有自定义 baseadapter 的列表视图吗?我宁愿不使用索引,以防 JSON 改变顺序。
  • ListView 将通过索引从适配器获取对象,因此无论如何您都需要按某种顺序维护列表。如果您想保持键的顺序(并在编译时知道键是什么),您可以按照您喜欢的顺序对这些键的数组进行硬编码,并在从 Map 中获取时将其用于您的排序。

标签: android android-listview


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

【讨论】:

  • 如果您的 listdata 是 JSONObject arrayList,则 listdata.add(jArray.optJSONObject(i));ArrayList&lt;JSONObject&gt; listdata = new ArrayList&lt;JSONObject&gt;();
  • 好sn-p。以防万一:有一个帮助类将 JSONObject/JSONArray 转换为 github 上的标准 Map/List gist.github.com/codebutler/2339666
  • 为什么不使用ArrayList&lt;Object&gt;
  • 没有循环还有其他方法吗?
  • @K.Sopheak, Streams(Java 8 及更高版本)可以。
【解决方案2】:

我已经使用Gson (by Google) 完成了。

将以下行添加到模块的build.gradle

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON字符串:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"johnny_depp@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"leonardo_dicaprio@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"john_wayne@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"angelina_jolie@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"dido@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"adele@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"hugh_jackman@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"will_smith@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"clint_eastwood@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"barack_obama@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"kate_winslet@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"eminem@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

将 JSON 字符串转换为 ArrayList&lt;Model&gt; 的代码:

注意:你必须导入java.lang.reflect.Type;

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

希望这会对你有所帮助。

【讨论】:

  • 三行...完成!我认为这应该是公认的答案,因为 (a) 只有三行代码可以很好地工作,并且 (b) 很少有答案实际上执行了从 JSONArray 到 List 的类型转换。谢谢!
  • 必须是 JSONArray,JSONElement 好像不行。所以,请使用getAsJsonArray() 方法。谢谢!
  • 正是我需要的,谢谢!注意:你必须导入这些:java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
  • 太棒了,这应该是公认的答案!。谢谢
  • 如果 typetoken 的 init 受到保护,这不起作用
【解决方案3】:

我有快速的解决方案。只需创建一个文件ArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

用法:

ArrayList<Object> list = ArrayUtil.convert(jArray);

JSONArray jArr = ArrayUtil.convert(list);

【讨论】:

  • 如果需要返回ArrayList&lt;String&gt;我该怎么办
  • 我认为不可能将 ArrayList 转换为 ArrayList
  • 感谢这个答案。你解决了我的一天!我花了 2 小时试图解决这个问题。实际上我的问题是我想把转换后的JSONArray 放到一个列表中,这样我就可以把List 放到HashMap 中,所以这个工具对我很有效。谢谢@Vasili Suricov
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    您可以只创建一个JSONObject 本身,而不是将 JSON 字符串转换为 ArrayList 甚至是 Map。该对象可以根据需要get string values by key,也可以remove objects

    要从格式正确的 JSON 字符串创建 JSONObject,您只需调用 appropriate constructor

    JSONObject json = new JSONObject(jsonString);
    

    【讨论】:

    • 我在使用这个解决方案时遇到的问题是,在处理 JSONObject 和 JSONArray 时,它们会抛出 JSONException。有时将 JSONArray 的内容传递给不必知道 JSON 的函数会很方便。
    • 我同意。我将使用 JSONObject 作为将 JSON 文本解析为可用模型对象的一部分。引发的任何 JSONException 都表明源 JSON 存在问题,这意味着您无法将其解析为 JSONArray 或 JSONObject,更不用说不同的模型对象了。
    【解决方案6】:

    在 Java 8 中,

    IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())
    

    【讨论】:

    • 唯一的问题是 JSONArray.getString(...) 抛出一个必须在映射内部处理的异常,所以你最终得到List&lt;String&gt; listOfStrings = IntStream.range(0, array.length()).mapToObj(i -&gt; { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList()); 这一点都不优雅更多的。所以我会去 foreach :)
    • 这是最好的答案(恕我直言),但如果有一种方法不需要多次访问 jsonArray 引用,那就太好了。
    【解决方案7】:
     JSONArray array = new JSONArray(json);
     List<JSONObject> list = new ArrayList();
     for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));
    

    【讨论】:

      【解决方案8】:

      为了方便,请使用 POJO。

      像这样尝试..

      List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();
      
      JSONObject jsonObject = new JSONObject(jsonString);
      YourPojoObject yourPojo = new YourPojoObject();
      yourPojo.setId(jsonObject.getString("idName"));
      ...
      ...
      
      yourPojos.add(yourPojo);
      

      【讨论】:

        【解决方案9】:

        我有快速的解决方案。只需创建一个文件ArrayUtil.java

        ObjectMapper mapper = new ObjectMapper(); 
        List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));
        

        用法:

        ArrayList<Object> list = ArrayUtil.convert(jArray);
        

        JSONArray jArr = ArrayUtil.convert(list);
        

        【讨论】:

          【解决方案10】:

          如果你想从 JSON 字符串数组中提取数据,这里是我的工作代码。将参数更改为您的数据。


          PoJo 类

          public class AllAppModel {
              private String appName;
              private String packageName;
              private int uid;
              private boolean isSelected;
              private boolean isSystemApp;
              private boolean isFav;
          }
          

          使用下面的代码行提取数据

          try {
              JSONArray jsonArr = new JSONArray("Your json string array");
              List<AllAppModel> lstExtrextData = new ArrayList<>();
              for (int i = 0; i < jsonArr.length(); i++) {
                  JSONObject jsonObj = jsonArr.getJSONObject(i);
                  AllAppModel data = new AllAppModel();
                  data.setAppName(jsonObj.getString("appName"));
                  data.setPackageName(jsonObj.getString("packageName"));
                  data.setUid(jsonObj.getInt("uid"));
                  data.setSelected(jsonObj.getBoolean("isSelected"));
                  data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
                  data.setFav(jsonObj.getBoolean("isFav"));
                  lstExtrextData.add(data);
              }
          } catch (JSONException e) {
              e.printStackTrace();
          }
          

          它将返回 PoJo 类对象的列表。

          【讨论】:

            【解决方案11】:

            使用 Gson

                List<Student> students = new ArrayList<>();
                JSONArray jsonArray = new JSONArray(stringJsonContainArray);
                for (int i = 0; i < jsonArray.length(); i++) {
                    Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
                    students.add(student);
                }
                return students;
            

            【讨论】:

              【解决方案12】:

              按照主题的原始主题:

              将 jsonarray 转换为列表(此处使用 jackson jsonarray 和对象映射器):

              ObjectMapper mapper = new ObjectMapper();
              JSONArray array = new JSONArray();
              array.put("IND");
              array.put("CHN");
              List<String> list = mapper.readValue(array.toString(), List.class);
              

              【讨论】:

                【解决方案13】:

                Java 8 风格

                   JSONArray data = jsonObject.getJSONArray("some-node");
                
                   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                                .map(e -> (JSONObject)e)
                                .collect(Collectors.toList());
                

                【讨论】:

                • 不工作...出现错误 - Type mismatch: cannot convert from Object to List&lt;JSONObject&gt;
                【解决方案14】:

                如果 Json 对象包含一个字符串数组,那么有一种方法我们甚至不需要使用 JSONArray。

                如果 Json 不是字符串格式,我们可以将 json 转换为字符串。 现在如果 Json 字符串是:

                String value = "[\"value1\",\"value2\"]";
                

                那么我们就可以使用获取String的List了:

                List<String> result = new Gson().fromJson(value, List.class);
                

                【讨论】:

                  【解决方案15】:

                  使用 GSON 和 Kotlin,您只需要这个:

                      val arr = Gson().fromJson(jsonArrayInString, Array<T>::class.java)
                  

                  【讨论】:

                    【解决方案16】:
                    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;
                    }
                    

                    【讨论】:

                      【解决方案17】:

                      通用变体

                      public static <T> List<T> getList(JSONArray jsonArray) throws Exception {
                      
                          List<T> list = new ArrayList<>(jsonArray.length());
                      
                          for (int i = 0; i < jsonArray.length(); i++) {
                      
                              list.add((T)jsonArray.get(i));
                          }
                      
                          return list;
                      
                      }
                      
                      //Usage
                      
                      List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));
                      

                      【讨论】:

                        【解决方案18】:
                        ArrayList<String> listdata = new ArrayList<String>();     
                        JSONArray jArray = (JSONArray)jsonObject; 
                        if (jArray != null) { 
                         listdata.addAll(jArray);
                        }
                        

                        @simplified

                        【讨论】:

                          【解决方案19】:

                          更简单的 Java 8 替代方案:

                          JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]
                          
                          List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
                          

                          【讨论】:

                          • 试过这个。不工作。出现错误 - Type mismatch: cannot convert from Object to List&lt;JSONObject&gt;
                          【解决方案20】:

                          使用 Kotlin,您可以通过使用 MutableList 包装 JSONArray 来避免循环,例如

                          val artistMetadata = player.metadata.optJSONArray("artist")
                          val artists = MutableList<String>(artistMetadata.length()) { i -> artistMetadata.getString(i)}
                          

                          【讨论】:

                            【解决方案21】:
                            public static List<String> convertJsonArrayToStringList(JsonArray ja){
                                
                                List<String> result = new ArrayList<String>();     
                                for(JsonElement je: ja)
                                    result.add(je.getAsString());
                                
                                return result;
                                
                            }
                            

                            【讨论】:

                              【解决方案22】:

                              我用来将 json 数组转换为 ArrayList 的单行代码,用于存储在名为 classData 的变量中的以下列出的 json 字符串。

                              List<String> names = new Gson().fromJson(classData.getAsJsonObject("result").getAsJsonArray("names").toString(), new TypeToken<List<String>>(){}.getType());
                              
                              {   
                                  "result": {
                                      "id": "104297",
                                      "class": "Chemistry",
                                      "total": 57,
                                      "names": [
                                          "Alex",
                                          "Dan",
                                          "Rex",
                                          "Tony",
                                          "Elizabeth"
                                      ],
                                      ...
                                  }
                              }
                              

                              【讨论】:

                                【解决方案23】:

                                可以这样做(Java &gt;= 8):

                                    // Functional (variable)
                                    Function<JSONArray, ArrayList<String>> convert = jsonArray -> (ArrayList<String>) jsonArray.stream()
                                        .map(item -> item.toString())
                                        .collect(Collectors.toList());
                                
                                    // Call
                                    convert.apply(jsonArray);
                                
                                
                                    // Regular method (OOP)
                                    private Function<JSONArray, ArrayList<String>> convert() {
                                        return jsonArray -> (ArrayList<String>) jsonArray.stream()
                                            .map(item -> item.toString())
                                            .collect(Collectors.toList());
                                   }
                                
                                   // Call
                                   convert().apply(jsonArray);
                                
                                

                                【讨论】:

                                  猜你喜欢
                                  • 2015-07-30
                                  • 2016-10-29
                                  • 1970-01-01
                                  • 2011-06-18
                                  • 2023-03-27
                                  • 2021-06-28
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多