JSONarray를 ArrayList로 변환


104

JSON 문자열을 다운로드하고 JSONArray로 변환하고 있습니다. 나는 그것을 목록보기에 넣고 나중에 그 목록보기에서 삭제할 수 있어야하며 JSONArray에는 .remove 메서드가 없기 때문에 (Obama에게 감사드립니다) 배열 목록으로 변환하려고합니다.

여기 내 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"}]

배열로 가져 와서 각각의 키로 문자열을 호출 할 수 있어야합니다. 도움을 주셔서 감사합니다!


키를 말할 때 그것은 일종의 사전 (Android의지도)을 의미하지 않습니까? 배열은 인덱스 기반입니다. 생성 및 사용 방법 은 developer.android.com/reference/java/util/Map.html 을 참조 하세요 .
— brianestey

사용자 지정 기본 어댑터로 목록보기를 채우는 데 맵을 사용할 수 있습니까? JSON이 순서를 변경하는 경우 인덱스를 사용하지 마십시오.
— TheGeekNess

ListView는 인덱스별로 어댑터에서 개체를 가져 오므로 어떤 경우에도 목록을 어떤 순서로 유지해야합니다. 키의 순서를 유지하고 컴파일 타임에 키가 무엇인지 알고 싶다면 원하는 순서로 해당 키 배열을 하드 코딩하고 맵에서 가져올 때 순서에 사용할 수 있습니다.
— brianestey

답변:


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

3
그리고 목록 데이터 listdata.add(jArray.optJSONObject(i));가 JSONObject arrayList이면. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
— 수빈 세바스찬

2
좋은 스 니펫. 누군가 원하는 경우 : JSONObject / JSONArray를 표준 Map / List로 변환하는 도우미 클래스가 github gist.github.com/codebutler/2339666
— inexcii

2
왜 사용하지 ArrayList<Object>않습니까?
— natanavra 2015

Json 배열이 비어 있습니다. 답장주세요 형.
— MohanRaj S 2016

3
루프없이 이것을 수행하는 다른 방법이 있습니까?
— K.Sopheak

64

나는 Gson(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);
    }
}

이것이 당신을 도울 것입니다.


4
세 줄 ... 완료! (a) 아름답게 작동하는 코드가 세 줄 뿐이고 (b) 실제로 JSONArray에서 List <CustomObject>로 형식화 된 변환을 수행하는 답변이 거의 없기 때문에 이것이 허용 된 대답이어야한다고 생각합니다. 감사합니다!
— John Ward

JSONArray 여야하며 JSONElement가 작동하지 않는 것 같습니다. 따라서 getAsJsonArray()방법을 사용하십시오 . 감사합니다!
— 嘉恒陶

1
정확히 내가 필요한 것, 감사합니다! 참고 : 다음을 가져와야합니다. java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
— Chandrani H

굉장합니다, 이것은 받아 들여진 대답이어야했습니다!. 감사합니다
— Yeuni

이것은 typetoken의 초기화가 보호된다는 말은 작동하지 않습니다
— nikoss

7

이 방법을 시도해보십시오. 단순히 루프를 통해 자신 만의 어레이를 구축하십시오. 이 코드는 문자열 배열이라고 가정하고 특정 배열 구조에 맞게 수정하는 것이 어렵지 않아야합니다.

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

6

JSON 문자열을 ArrayList 또는 Map으로 변환하는 대신 JSONObject 자체를 만들 수 있습니다 . 이 개체에는 원하는대로 키로 문자열 값 을 가져 오고 개체 를 제거 할 수있는 기능이 있습니다 .

JSONObject올바른 형식의 JSON 문자열에서 를 생성하려면 적절한 생성자 를 호출하기 만하면 됩니다.

JSONObject json = new JSONObject(jsonString);

1
특히이 솔루션에서 발생하는 문제는 JSONObject 및 JSONArray를 다룰 때 JSONException을 던진다는 것입니다. 때로는 JSONArray의 내용을 JSON을 인식 할 필요가없는 함수에 전달하는 것이 편리합니다.
— Aaron Dougherty 2015

2
나는 동의한다. JSON 텍스트를 사용 가능한 모델 개체로 구문 분석하는 과정에서 JSONObject를 사용합니다. 발생하는 모든 JSONException은 소스 JSON에 문제가 있음을 나타냅니다. 즉, 다른 모델 객체는 말할 것도없고 JSONArray 또는 JSONObject로 파싱 할 수 없습니다.
— brianestey

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

뭐 내가 할 필요는 반환 할 경우ArrayList<String>

나는 ArrayList를 <문자열>에 ArrayList를 <개체> 캐스팅 할 수없는 생각
— 바실리 Suricov

1
이 답변에 대한 명성. U는 내 하루를 해결했습니다! 나는 이것을 고치기 위해 2 시간을 보냈다. 사실 내 문제는 내가 변환을 넣고 싶어했다 JSONArray내가 넣을 수 있도록 목록에 ListA의 HashMap이 폴더의 유틸리티 꽤 잘 나를 위해 일한 있도록. 감사합니다 @Vasilii Suricov
— Jose Mhlanga

5

자바 8에서는

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

1
이것의 유일한 문제는 JSONArray.getString (...)이 매핑 내에서 처리해야하는 예외를 발생시켜 List<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());더 이상 우아하지 않다는 것입니다. 나는 :) foreach는 함께 갈거야 그래서
— LazR

이것은 여기 (imho)에서 가장 좋은 대답이지만 jsonArray 참조에 두 번 이상 액세스 할 필요가없는 방법이 있다면 우아 할 것입니다.
— djangofan

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

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

1

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;

1

JSON 문자열 배열에서 데이터를 추출하려면 여기에 내 작업 코드가 있습니다. 매개 변수를 데이터로 변경하십시오.


PoJo 클래스

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 클래스 개체 목록을 반환합니다.


1

자바 8 스타일

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

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

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

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

0

일반 변형

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

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

@쉽게 한


0

스레드의 원래 주제로 이동 :

jsonarray를 목록으로 변환 (여기서 jackson jsonarray 및 object mapper 사용) :

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

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());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.