有没有办法将JSON Array转换为普通的Java Array for android ListView数据绑定?
答案 0 :(得分:176)
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());
}
}
答案 1 :(得分:54)
如果您还没有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 :(得分:11)
不要使用捆绑式org.json
库,而是尝试使用Jackson或GSON,这是一个单行。杰克逊,f.ex:
List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
答案 3 :(得分:10)
也许这只是一种解决方法(效率不高),但你可以这样做:
String[] resultingArray = yourJSONarray.join(",").split(",");
显然,您可以使用您喜欢的任何内容更改“,
”分隔符(我有JSONArray
个电子邮件地址)
答案 4 :(得分:4)
使用可以使用String[]
代替ArrayList<String>
:
它将减少ArrayList具有的内存开销
希望它有所帮助!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
答案 5 :(得分: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);
}
}
也适用于字符串数组
答案 6 :(得分:0)
这是一种更好的方法:如果您从API获取数据。然后PARSE 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();
...
答案 7 :(得分:0)
我们从转化开始[JSONArray - &gt;列表&lt; JSONObject&gt; ]
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;
}
答案 8 :(得分: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;
}
答案 9 :(得分: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;
}
答案 10 :(得分: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("\",\"");
答案 11 :(得分:0)
使用Java流,您可以仅使用IntStream
映射对象:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
答案 12 :(得分:0)
改进 Pentium10s Post:
我只是使用 foreach 循环将 JSON 数组的元素放入列表中。这样代码更清晰。
ArrayList<String> list = new ArrayList<String>();
JSONArray jsonArray = (JSONArray)jsonObject;
jsonArray.forEach(element -> list.add(element.toString());
答案 13 :(得分:-1)
我知道问题是针对Java
的。但是我想为Kotlin
分享一个可能的解决方案,因为我认为它很有用。
使用Kotlin,您可以编写扩展功能,将JSONArray
转换为原生(Kotlin)数组:
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
现在,您可以直接在asArray()
实例上调用JSONArray
。
答案 14 :(得分:-3)
如何使用java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())