将Json数组转换为普通的Java列表

133 人关注

是否有办法将JSON数组转换为普通的Java数组,用于android ListView数据绑定?

1 个评论
有趣的是, org.JSONArray 在引擎盖下使用了一个ArrayList...替换代码1】,所以大多数循环在很多情况下都是白做的(只是为了封装)。
java
android
json
Houston we have a problem
Houston we have a problem
发布于 2010-08-03
16 个回答
Pentium10
Pentium10
发布于 2011-10-04
已采纳
0 人赞同
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 循环缺少结尾的小括号......试着编辑,但没有足够的字符来通过审批。 哦,好吧!只是一个参考。
实际上并没有遗漏,回答者只是粘贴了一大块代码,其中有函数的开括号和闭括号。
dbm
如果 jsonArray.get(i) 返回null(作为解析这个的结果: [ "String 1", null, "String 2" ] )会发生什么?那你的for-loop不会崩溃吗?
谢谢。如果一个人有sring,那么JSONArray可以被创建为JSONArray jsonArray = new JSONArray (yourString); 其余的代码将保持不变。
根据不同的实现,你可能需要 size() 而不是 length()
Nick
Nick
发布于 2011-10-04
0 人赞同

如果你还没有一个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) );
    
Nick
对不起,你是对的--我把Lists和JSONArrays混淆了:)它确实是JSONArray.length()。
StaxMan
StaxMan
发布于 2011-10-04
0 人赞同

与其使用捆绑的 org.json 库,不如尝试使用Jackson或GSON,这只是一个单行代码。使用Jackson,例如。

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
    
Guido Sabatini
Guido Sabatini
发布于 2011-10-04
0 人赞同

也许这只是一个变通办法(效率不高),但你可以这样做。

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

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

请注意,你必须绝对确定数据不包含你的分隔符,否则你会得到损坏的数据。
而结果必须是一个字符串。
Samuel Philipp
Samuel Philipp
发布于 2011-10-04
0 人赞同

使用Java Streams,你可以只用一个 IntStream 来映射对象。

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());
    
nurnachman
nurnachman
发布于 2011-10-04
0 人赞同

使用可以用 String[] 代替 ArrayList<String>

它将减少ArrayList的内存开销。

Hope it helps!

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

我知道这个问题是关于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);

也适用于字符串数组

Thiago
Thiago
发布于 2011-10-04
0 人赞同

这里有一个更好的方法:如果你从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();
    
ceph3us
ceph3us
发布于 2011-10-04
0 人赞同

we starting from conversion [ JSONArray -> List < JSONObject > ]

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;
    
Iman Marashi
Iman Marashi
发布于 2011-10-04
0 人赞同

你可以用 String[] 来代替 ArrayList<String>

Hope it helps!

   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;
    
Mayank Yadav
Mayank Yadav
发布于 2011-10-04
0 人赞同

我们可以简单地将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("\",\"");
    
StackOverflow
StackOverflow
发布于 2011-10-04
0 人赞同

To improve Pentium10s Post:

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

ArrayList<String> list = new ArrayList<String>();
JSONArray jsonArray = (JSONArray)jsonObject;
jsonArray.forEach(element -> list.add(element.toString());
    
user10878560
user10878560
发布于 2011-10-04
0 人赞同
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;
    
user1659299
user1659299
发布于 2011-10-04
0 人赞同

你可以使用迭代器。

JSONArray exportList = (JSONArray)response.get("exports");
Iterator i = exportList.iterator();
while (i.hasNext()) {
      JSONObject export = (JSONObject) i.next();
      String name = (String)export.get("name");
    
Johannes Barop
Johannes Barop
发布于 2011-10-04
0 人赞同

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

使用Kotlin,你可以编写一个扩展函数,将 JSONArray 转换为一个本地(Kotlin)数组。

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

现在你可以直接在一个JSONArray实例上调用asArray()