将 JSONarray 转换为 ArrayList

我正在下载一个 JSON 字符串并将其转换为 JSONArray。我把它放到一个列表视图中,需要稍后能够从该列表视图中删除,因为 JSONArray 没有。方法(感谢奥巴马) ,我试图将其转换为数组表。

下面是我的 JSON (the array.toString ()) :

[
{
"thumb_url":"tb1370913834.jpg",
"event_id":"15","count":"44",
"event_tagline":"this is a tagline",
"event_name":"5th birthday",
"event_end":"1370919600",
"event_start":"1370876400"
}
]

我需要把它放到一个数组中,并且能够通过它们各自的键调用字符串。感谢你的帮助!

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

试试这边 只需循环访问它,构建您自己的数组。这段代码假设它是一个字符串数组,修改它以适应特定的数组结构应该不难。

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );

不需要将 JSON 字符串转换为 ArrayList 甚至 Map,您只需要创建一个 JSONObject本身。这个对象具有 按键获取字符串值移动物体的能力。

要从格式正确的 JSON 字符串创建 JSONObject,只需调用 合适的构造函数

JSONObject json = new JSONObject(jsonString);

为了方便使用,可以使用 POJO。

试试这样. 。

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();


JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...


yourPojos.add(yourPojo);
 JSONArray array = new JSONArray(json);
List<JSONObject> list = new ArrayList();
for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

我用的是 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" +
"    ]";

返回文章页面

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

希望这个能帮到你。

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

我有快速解决方案。只要创建一个文件 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);

在 Java 8中,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

我有快速解决方案。只要创建一个文件 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);

通用变体

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {


List<T> list = new ArrayList<>(jsonArray.length());


for (int i = 0; i < jsonArray.length(); i++) {


list.add((T)jsonArray.get(i));
}


return list;


}


//Usage


List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));

利用 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;

如果您想从 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 类对象的列表。

ArrayList<String> listdata = new ArrayList<String>();
JSONArray jArray = (JSONArray)jsonObject;
if (jArray != null) {
listdata.addAll(jArray);
}

@ 简化

我只是按照最初的主题来说:

将 jsonarray 转换为 list (在这里使用了 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);

Java 8风格

   JSONArray data = jsonObject.getJSONArray("some-node");


List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
.map(e -> (JSONObject)e)
.collect(Collectors.toList());

一个更简单的 Java8替代品:

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

使用 Kotlin,您可以通过使用 MutableList 包装 JSONArray 来避免循环,例如。

val artistMetadata = player.metadata.optJSONArray("artist")
val artists = MutableList<String>(artistMetadata.length()) { i -> artistMetadata.getString(i)}
public static List<String> convertJsonArrayToStringList(JsonArray ja){
    

List<String> result = new ArrayList<String>();
for(JsonElement je: ja)
result.add(je.getAsString());
    

return result;
    

}

如果 Json 对象包含一个字符串数组,那么有一种方法甚至不需要使用 JSONArray。

如果 Json 不是字符串格式,我们可以将其转换为字符串。 现在如果 Json string 是:

String value = "[\"value1\",\"value2\"]";

然后我们可以用它来获得 List of String:

List<String> result = new Gson().fromJson(value, List.class);

我用来将下面列出的 json 字符串存储在一个名为 classData 的变量中的 json 数组转换为 ArrayList 的单行代码。

List<String> names = new Gson().fromJson(classData.getAsJsonObject("result").getAsJsonArray("names").toString(), new TypeToken<List<String>>(){}.getType());
{
"result": {
"id": "104297",
"class": "Chemistry",
"total": 57,
"names": [
"Alex",
"Dan",
"Rex",
"Tony",
"Elizabeth"
],
...
}
}

有了 GSON 和 Kotlin,你只需要这样做:

    val arr = Gson().fromJson(jsonArrayInString, Array<T>::class.java)

这可以做到(Java >= 8) :

    // Functional (variable)
Function<JSONArray, ArrayList<String>> convert = jsonArray -> (ArrayList<String>) jsonArray.stream()
.map(item -> item.toString())
.collect(Collectors.toList());


// Call
convert.apply(jsonArray);




// Regular method (OOP)
private Function<JSONArray, ArrayList<String>> convert() {
return jsonArray -> (ArrayList<String>) jsonArray.stream()
.map(item -> item.toString())
.collect(Collectors.toList());
}


// Call
convert().apply(jsonArray);