我正在下载JSON字符串并将其转换为JSONArray。我把它放到列表视图中,需要以后能够从列表视图中删除,并且由于JSONArray没有.remove方法(感谢奥巴马),我试图将其转换为arraylist。
这是我的JSON(array.toString()):
[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]
我需要将它放入一个数组中,并能够通过各自的键调用字符串。感谢任何帮助!
答案 0 :(得分:144)
ArrayList<String> listdata = new ArrayList<String>();
JSONArray jArray = (JSONArray)jsonObject;
if (jArray != null) {
for (int i=0;i<jArray.length();i++){
listdata.add(jArray.getString(i));
}
}
答案 1 :(得分:45)
我是使用Gson
(by Google)完成的。
将以下行添加到模块的build.gradle
:
dependencies {
// ...
// Note that `compile` will be deprecated. Use `implementation` instead.
// See https://stackoverflow.com/a/44409111 for more info
implementation 'com.google.code.gson:gson:2.8.2'
}
JSON
字符串:
private String jsonString = "[\n" +
" {\n" +
" \"id\": \"c200\",\n" +
" \"name\": \"Ravi Tamada\",\n" +
" \"email\": \"ravi@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c201\",\n" +
" \"name\": \"Johnny Depp\",\n" +
" \"email\": \"johnny_depp@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c202\",\n" +
" \"name\": \"Leonardo Dicaprio\",\n" +
" \"email\": \"leonardo_dicaprio@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c203\",\n" +
" \"name\": \"John Wayne\",\n" +
" \"email\": \"john_wayne@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c204\",\n" +
" \"name\": \"Angelina Jolie\",\n" +
" \"email\": \"angelina_jolie@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"female\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c205\",\n" +
" \"name\": \"Dido\",\n" +
" \"email\": \"dido@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"female\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c206\",\n" +
" \"name\": \"Adele\",\n" +
" \"email\": \"adele@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"female\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c207\",\n" +
" \"name\": \"Hugh Jackman\",\n" +
" \"email\": \"hugh_jackman@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c208\",\n" +
" \"name\": \"Will Smith\",\n" +
" \"email\": \"will_smith@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c209\",\n" +
" \"name\": \"Clint Eastwood\",\n" +
" \"email\": \"clint_eastwood@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c2010\",\n" +
" \"name\": \"Barack Obama\",\n" +
" \"email\": \"barack_obama@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c2011\",\n" +
" \"name\": \"Kate Winslet\",\n" +
" \"email\": \"kate_winslet@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"female\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"id\": \"c2012\",\n" +
" \"name\": \"Eminem\",\n" +
" \"email\": \"eminem@gmail.com\",\n" +
" \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
" \"gender\" : \"male\",\n" +
" \"phone\": {\n" +
" \"mobile\": \"+91 0000000000\",\n" +
" \"home\": \"00 000000\",\n" +
" \"office\": \"00 000000\"\n" +
" }\n" +
" }\n" +
" ]";
ContactModel.java
:
public class ContactModel {
public String id;
public String name;
public String email;
}
将JSON字符串转换为ArrayList<Model>
的代码:
注意:您必须导入java.lang.reflect.Type;
:
// Top of file
import java.lang.reflect.Type;
// ...
private void parseJSON() {
Gson gson = new Gson();
Type type = new TypeToken<List<ContactModel>>(){}.getType();
List<ContactModel> contactList = gson.fromJson(jsonString, type);
for (ContactModel contact : contactList){
Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
}
}
希望这会对你有所帮助。
答案 2 :(得分:6)
试试这种方式 只需循环,构建自己的数组。此代码假定它是一个字符串数组,应该很难修改以适合您的特定数组结构。
JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );
答案 3 :(得分:6)
您可以只创建一个JSONObject,而不是将JSON字符串转换为ArrayList甚至是Map。此对象可以根据需要get string values by key使用,也可以remove objects。
要从格式正确的JSON字符串创建JSONObject
,只需拨打 appropriate constructor。
JSONObject json = new JSONObject(jsonString);
答案 4 :(得分:6)
我有快速解决方案。只需创建一个文件ArrayUtil.java
import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;
public class ArrayUtil
{
public static ArrayList<Object> convert(JSONArray jArr)
{
ArrayList<Object> list = new ArrayList<Object>();
try {
for (int i=0, l=jArr.length(); i<l; i++){
list.add(jArr.get(i));
}
} catch (JSONException e) {}
return list;
}
public static JSONArray convert(Collection<Object> list)
{
return new JSONArray(list);
}
}
用法:
ArrayList<Object> list = ArrayUtil.convert(jArray);
或
JSONArray jArr = ArrayUtil.convert(list);
答案 5 :(得分:4)
JSONArray array = new JSONArray(json);
List<JSONObject> list = new ArrayList();
for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));
答案 6 :(得分:2)
为方便使用,请使用POJO。
试试这个..
List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();
JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...
yourPojos.add(yourPojo);
答案 7 :(得分:2)
在Java 8中,
IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())
答案 8 :(得分:1)
如果要从JSON字符串数组提取数据,这是我的工作代码。更改参数作为数据。
public class AllAppModel {
private String appName;
private String packageName;
private int uid;
private boolean isSelected;
private boolean isSystemApp;
private boolean isFav;
}
try {
JSONArray jsonArr = new JSONArray("Your json string array");
List<AllAppModel> lstExtrextData = new ArrayList<>();
for (int i = 0; i < jsonArr.length(); i++) {
JSONObject jsonObj = jsonArr.getJSONObject(i);
AllAppModel data = new AllAppModel();
data.setAppName(jsonObj.getString("appName"));
data.setPackageName(jsonObj.getString("packageName"));
data.setUid(jsonObj.getInt("uid"));
data.setSelected(jsonObj.getBoolean("isSelected"));
data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
data.setFav(jsonObj.getBoolean("isFav"));
lstExtrextData.add(data);
}
} catch (JSONException e) {
e.printStackTrace();
}
它将返回您PoJo类对象列表。
答案 9 :(得分:1)
Java 8样式
JSONArray data = jsonObject.getJSONArray("some-node");
List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
.map(e -> (JSONObject)e)
.collect(Collectors.toList());
答案 10 :(得分:0)
使用 GSON 和 Kotlin,你只需要这个:
val arr = Gson().fromJson(jsonArrayInString, Array<T>::class.java)
答案 11 :(得分:0)
如果 Json 对象包含一个字符串数组,那么有一种方法我们甚至不需要使用 JSONArray。
如果 Json 不是字符串格式,我们可以将 json 转换为字符串。 现在如果 Json 字符串是:
plot %+% dt # `%+%` is used to change the data used by one or more layers. See help("+.gg")
然后我们就可以使用得到字符串列表:
String value = "[\"value1\",\"value2\"]";
答案 12 :(得分:0)
public static List<String> convertJsonArrayToStringList(JsonArray ja){
List<String> result = new ArrayList<String>();
for(JsonElement je: ja)
result.add(je.getAsString());
return result;
}
答案 13 :(得分:0)
使用 Kotlin,您可以通过使用 MutableList 包装 JSONArray 来避免循环,例如
val artistMetadata = player.metadata.optJSONArray("artist")
val artists = MutableList<String>(artistMetadata.length()) { i -> artistMetadata.getString(i)}
答案 14 :(得分:0)
更简单的Java 8替代方法:
JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]
List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
答案 15 :(得分:0)
只需按照线程的原始主题进行操作即可
将jsonarray转换为列表(此处使用jackson jsonarray和对象映射器):
ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);
答案 16 :(得分:0)
ArrayList<String> listdata = new ArrayList<String>();
JSONArray jArray = (JSONArray)jsonObject;
if (jArray != null) {
listdata.addAll(jArray);
}
@简体
答案 17 :(得分:0)
使用Gson
List<Student> students = new ArrayList<>();
JSONArray jsonArray = new JSONArray(stringJsonContainArray);
for (int i = 0; i < jsonArray.length(); i++) {
Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
students.add(student);
}
return students;
答案 18 :(得分:0)
通用变体
private interface ParseCallable<T> {
T call(JSONArray jsonArray, int index) throws JSONException;
}
private <T> List<T> getList(JSONArray jsonArray, ParseCallable<T> callable) throws Exception {
List<T> list = new ArrayList<>(jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++) {
T t = callable.call(jsonArray, i);
list.add(t);
}
return list;
}
用法
List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"), new ParseCallable<String>() {
@Override
public String call(JSONArray jsonArray, int index) throws JSONException {
return jsonArray.getString(index);
}
});
List<Integer> listKeyInteger = getList(dataJsonObject.getJSONArray("keyInteger"), new ParseCallable<Integer>() {
@Override
public Integer call(JSONArray jsonArray, int index) throws JSONException {
return jsonArray.getInt(index);
}
});
答案 19 :(得分:0)
我有快速解决方案。只需创建一个文件ArrayUtil.java
ObjectMapper mapper = new ObjectMapper();
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));
用法:
ArrayList<Object> list = ArrayUtil.convert(jArray);
或
JSONArray jArr = ArrayUtil.convert(list);
答案 20 :(得分:0)
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;
}
答案 21 :(得分:0)
ArrayList<String> dataList = new ArrayList<String>();
JSONArray jsonArray = (JSONArray)jsonObject;
for(Object obj : jsonArray){
dataList.add((String)obj);
}