将 Json Array 转换为普通 Java 列表
Posted
技术标签:
【中文标题】将 Json Array 转换为普通 Java 列表【英文标题】:Convert Json Array to normal Java list 【发布时间】:2011-03-24 16:03:46 【问题描述】:有没有办法将 JSON Array 转换为普通的 Java Array 用于 android ListView 数据绑定?
【问题讨论】:
有趣的是org.JSONArray
在底层使用了一个ArrayList...The arrayList where the JSONArray's properties are kept
,所以大多数循环在很多情况下都是徒劳的(只是为了封装)
【参考方案1】:
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 循环缺少右括号...尝试编辑,但字符数不足以通过批准。那好吧!仅供参考。 itz 实际上并没有丢失,回答者只是粘贴了一段带有函数的打开和关闭大括号的代码。 如果jsonArray.get(i)
返回 null 会发生什么(作为解析结果:[ "String 1", null, "String 2" ]
)?那你的for循环不会崩溃吗?
谢谢。如果有 sring 那么 JSONArray 可以创建为 JSONArray jsonArray = new JSONArray (yourString);其余代码将保持不变。
根据具体实现,您可能需要size()
而不是length()
。【参考方案2】:
如果您还没有 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) );
【讨论】:
对不起,你是对的 - 我将 Lists 与 JSONArrays 混淆了 :) 它确实是 JSONArray.length()。【参考方案3】:不要使用捆绑的org.json
库,而是尝试使用Jackson 或GSON,这是一个单行。与杰克逊,前任:
List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
【讨论】:
【参考方案4】:也许这只是一种解决方法(不是很有效),但您可以这样做:
String[] resultingArray = yourJSONarray.join(",").split(",");
显然你可以用任何你喜欢的东西来改变',
'分隔符(我有一个JSONArray
的电子邮件地址)
【讨论】:
请注意,您必须绝对确定数据不包含您的分隔符,否则您将得到损坏的数据。 结果必须是字符串。【参考方案5】:使用 Java 流,您可以使用 IntStream
映射对象:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
【讨论】:
【参考方案6】:使用可以使用String[]
而不是ArrayList<String>
:
它将减少 ArrayList 的内存开销
希望对你有帮助!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++)
parametersArray[i] = parametersJSONArray.getString(i);
【讨论】:
【参考方案7】:我知道这个问题是关于 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);
也适用于字符串数组
【讨论】:
【参考方案8】:这是一种更好的方法:如果您从 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();
...
【讨论】:
【参考方案9】:我们从转换开始[ JSONArray -> List ]
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;
【讨论】:
【参考方案10】:您可以使用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;
【讨论】:
【参考方案11】:我们可以简单地将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("\",\"");
【讨论】:
【参考方案12】:改进 Pentium10s Post:
我只是使用 foreach 循环将 JSON 数组的元素放入列表中。这样代码就更清晰了。
ArrayList<String> list = new ArrayList<String>();
JSONArray jsonArray = (JSONArray)jsonObject;
jsonArray.forEach(element -> list.add(element.toString());
【讨论】:
【参考方案13】: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;
【讨论】:
【参考方案14】:你可以使用迭代器:
JSONArray exportList = (JSONArray)response.get("exports");
Iterator i = exportList.iterator();
while (i.hasNext())
JSONObject export = (JSONObject) i.next();
String name = (String)export.get("name");
【讨论】:
【参考方案15】:我知道问题是针对Java
。但我想为Kotlin
分享一个可能的解决方案,因为我认为它很有用。
使用 Kotlin,您可以编写一个扩展函数,将 JSONArray
转换为原生 (Kotlin) 数组:
fun JSONArray.asArray(): Array<Any>
return Array(this.length()) this[it]
现在您可以直接在 JSONArray
实例上调用 asArray()
。
【讨论】:
【参考方案16】:使用 java.util.Arrays 怎么样?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
【讨论】:
我在JSONArray()
文档中没有看到 toArray()
方法。 json.org/javadoc/org/json/JSONArray.html如果有简单的toArray()
,这个问题可能不会被问到。
net.sf.json.JSONArray 具有 toArray() 方法,因此此响应适用于此 JSON 库。该问题未指定使用的库。以上是关于将 Json Array 转换为普通 Java 列表的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 雄辩不更新 JSON 列:数组到字符串的转换