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.