将Json Array转换为普通Java列表


130

有没有一种方法可以将JSON数组转换为用于Java ListView数据绑定的普通Java数组?


8
有趣的是,org.JSONArray在幕后使用了ArrayList ... The arrayList where the JSONArray's properties are kept,因此大多数循环在很多情况下都不做任何事情(仅用于封装)
Christophe Roussy 2015年

Answers:


186
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());
   } 
} 

5
for循环缺少右括号...尝试编辑,但没有足够的字符通过批准。那好吧!仅供参考。
Matt K

itz实际上并没有丢失,回答者只是在函数的打开和关闭括号之间粘贴了一段代码。
Sarim Javaid Khan 2013年

1
如果jsonArray.get(i)返回null(作为解析此结果:)会发生什么[ "String 1", null, "String 2" ]?那您的for-loop崩溃不会吗?
dbm

谢谢。如果有sring,则可以将JSONArray创建为JSONArray。jsonArray = new JSONArray(yourString); 其余代码将保持不变。
Kaushik Lele 2015年

根据实现,您可能需要size()而不是length()
Guillaume F.

57

如果您还没有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) );
}

2
抱歉,您是对的-我将列表与JSONArrays混淆了:)确实是JSONArray.length()。
尼克,2010年

13

与其使用捆绑org.json库,不如尝试使用杰克逊或GSON,因为这是一种方法。对于Jackson,f.ex:

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

11

也许这只是一种解决方法(效率不高),但是您可以执行以下操作:

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

显然,您可以,使用任何喜欢的内容更改“ ”分隔符(我有一个JSONArray电子邮件地址)


8
请注意,您必须绝对确保数据不包含分隔符char,否则最终将导致数据损坏。
Artemix 2012年

1
结果必须是字符串。
Nicolas Tyler

一线,完美。
zeeshan

4

使用可以使用String[]而不是ArrayList<String>

它将减少ArrayList具有的内存开销

希望能帮助到你!

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

3

使用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());

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);
    }
}

也适用于字符串数组


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();

...

0

我们从转换开始[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;
}

0

您可以使用String[]而不是ArrayList<String>

希望能帮助到你!

   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;
        }

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;
        }


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("\",\"");

-2

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

使用Kotlin,您可以编写扩展函数,将a JSONArray转换为本地(Kotlin)数组:

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.