将 JsonArray 转换为普通 Java 列表

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

277061 次浏览
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());
}
}

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

使用 java.util. Array 如何?

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

也许这只是一个变通方案(不是很有效) ,但你可以这样做:

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

显然,你可以改变“ ,”分隔符与任何你喜欢(我有一个电子邮件地址的 JSONArray)

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

也可用于字符串数组

这里有一个更好的方法: 如果您从 API 获取数据。然后解析 JSON 并将其加载到您的 listview 中:

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


...

不要使用绑定的 org.json库,尝试使用 Jackson 或 GSON,这只是一行程序:

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

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

它将减少数组列表的内存开销

希望能有帮助!

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

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

你可以使用 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;
}
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;
}

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

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

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

使用 Kotlin,你可以编写一个扩展函数,将 JSONArray转换成一个本机(Kotlin)数组:

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

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

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

为了改善奔腾10的职位:

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

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

可以使用迭代器:

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