ArrayList <MyCustomClass>를 JSONArray로 변환


115

ListView에 대한 ArrayAdapter 내에서 사용하는 ArrayList가 있습니다. 목록의 항목을 가져 와서 JSONArray로 변환하여 API로 보내야합니다. 나는 주변을 수색했지만 이것이 어떻게 작동하는지 설명하는 것을 찾지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.

업데이트-솔루션

이 문제를 해결하기 위해 내가 한 일은 다음과 같습니다.

ArrayList의 개체 :

public class ListItem {
    private long _masterId;
    private String _name;
    private long _category;

    public ListItem(long masterId, String name, long category) {
        _masterId = masterId;
        _name = name;
        _category = category;
    }

    public JSONObject getJSONObject() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("Id", _masterId);
            obj.put("Name", _name);
            obj.put("Category", _category);
        } catch (JSONException e) {
            trace("DefaultListItem.toString JSONException: "+e.getMessage());
        }
        return obj;
    }
}

변환 방법은 다음과 같습니다.

ArrayList<ListItem> myCustomList = .... // list filled with objects
JSONArray jsonArray = new JSONArray();
for (int i=0; i < myCustomList.size(); i++) {
        jsonArray.put(myCustomList.get(i).getJSONObject());
}

그리고 출력 :

[{"Name":"Name 1","Id":0,"Category":"category 1"},{"Name":"Name 2","Id":1,"Category":"category 2"},{"Name":"Name 3","Id":2,"Category":"category 3"}]

이것이 언젠가 누군가에게 도움이되기를 바랍니다!

답변:


115

JSONArray 생성자를 올바르게 읽은 경우 다음과 같이 모든 Collection (arrayList는 Collection의 하위 클래스)에서 빌드 할 수 있습니다.

ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("baar");
JSONArray jsArray = new JSONArray(list);

참조 :


3
그것은 귀하의 예제에서 작동하지만 내에서 ArrayList는 문자열이 아닌 객체로 구성됩니다. 제 질문에 넣어야한다고 생각합니다. 이것이 올바른 방향이라고 생각하지만 올바르게 작동하려면 클래스에서 toString을 재정의해야 할 수도 있습니다.
pmko

1
항상 목록을 반복하고이를 위해 jsArray.put ()을 사용할 수 있습니다. 결국 객체는 JSONArray로 변환되도록 toString 메소드를 가져야합니다. 왜냐하면 그것들은 하나로 저장 될 것이기 때문입니다.
Nanne 2011 년

3
그게 다가왔지 만 각 객체의 toString () 출력이 JSONArray에 String으로 삽입되었습니다. 나는 여전히 객체가 아닌 JSONArray of Strings로 끝났습니다. 결국 getJSONObject라는 클래스에 메서드를 만든 다음 ArrayList를 반복하고 그 결과를 JSONArray에 넣었습니다. 저를 올바른 길로 안내해 주셔서 감사합니다. 나는 당신의 대답을 받아들이고 내가 한 일에 대한 코드 샘플을 게시 할 것입니다. 나는 이것이 나쁜 SO 에티켓이 아니기를 바랍니다.
pmko

64

Gson 라이브러리를 사용하여 ArrayList를 JsonArray로 변환합니다.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();

5
이것은 OP가 원하는대로 org.json.JSONArray가 아니며 com.google.gson.JsonArray입니다.
nima

Gson.toJsonTree를 사용하는 동안 하나 이상의 Id 파일이 향기롭게 추가됩니다. 그것을 방지하는 방법.
Hitesh Kamani 2015 년

@HiteshKamani 자동으로 추가 ID를 추가하지 않습니다. 클래스에 ID 필드가있을 수 있습니다.
Purushotham 2015 년

실제로 작업에 따라 다릅니다. 일반적으로 전체 외부 라이브러리를 포함하여 Android SDK 자체에 적합한 작업을 수행 할 가치가 없습니다. 프로젝트에서 64K 방법의 가장자리에있는 경우 특히 그렇습니다.
Maxim Berezovsky 2015

1
안녕하세요 멋진 솔루션을이 JSON 배열에 ArrayList를 내 ArrayList를 변환하지 않습니다 그냥 빨리 일 uttam
Aashish Bhatnagar

35

누군가가 OP가 사용자 정의 목록을.가 org.json.JSONArray아닌 것으로 변환하고 싶어한다는 것을 알게 com.google.gson.JsonArray되면 올바른 대답은 다음과 같아야합니다.

Gson gson = new Gson();

String listString = gson.toJson(
                    targetList,
           new TypeToken<ArrayList<targetListItem>>() {}.getType());

 JSONArray jsonArray =  new JSONArray(listString);

신난다 :) 당신은 완벽한
Pratik Butani

여기 @zionpi이 라이브러리는 JSON 배열에 배열 목록을 변환하는 데 사용되는
Purushotham

@Uttam 여기서 두 개의 libs가 사용되는 것을 볼 수 있습니까?
Ravi Yadav

내가 해결 오전하면, JSONArray는 org.json에서하고 GSON는 com.google.json에서입니다
Purushotham

Gah 이것은 확인 된 예외를 throw합니다 : JSONException. 그렇지 않으면 여기에 완벽한 답이 있습니다.
Babken Vardanyan

5
public void itemListToJsonConvert(ArrayList<HashMap<String, String>> list) {

        JSONObject jResult = new JSONObject();// main object
        JSONArray jArray = new JSONArray();// /ItemDetail jsonArray

        for (int i = 0; i < list.size(); i++) {
            JSONObject jGroup = new JSONObject();// /sub Object

            try {
                jGroup.put("ItemMasterID", list.get(i).get("ItemMasterID"));
                jGroup.put("ID", list.get(i).get("id"));
                jGroup.put("Name", list.get(i).get("name"));
                jGroup.put("Category", list.get(i).get("category"));

                jArray.put(jGroup);

                // /itemDetail Name is JsonArray Name
                jResult.put("itemDetail", jArray);
                return jResult;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }

2
이것이 제가 게으른 프로그래머가 된 이유 중 하나입니다. SOF에서 작업을 수행하기 위해 캡슐 크기의 코드를 얻습니다. 붙여 넣기를 복사하면 모든 것이 작동합니다. 나는 정확히 같은 수행하는 로봇 ...로 대체됩니다 원더
수빈 세바스찬

1

나는 이미 대답했지만 여기에 더 나은 해결책이 있습니다.이 코드를 사용하십시오.

for ( Field f : context.getFields() ) {
     if ( f.getType() == String.class ) || ( f.getType() == String.class ) ) {
           //DO String To JSON
     }
     /// And so on...
}

이렇게하면 수동으로 입력하지 않고도 클래스에서 변수에 액세스 할 수 있습니다.

더 빠르고 더 .. 도움이 되었기를 바랍니다.

건배. :디


1

gradle에 추가하십시오.

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

변환 ArrayListJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);

0

kotlin과 Gson을 사용하면 더 쉽게 할 수 있습니다.

  1. 먼저 Gson 종속성을 추가하십시오.

implementation "com.squareup.retrofit2:converter-gson:2.3.0"

  1. 별도의 kotlin파일을 만들고 다음 방법을 추가하십시오.
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

fun <T> Gson.convertToJsonString(t: T): String {
    return toJson(t).toString()
}

fun <T> Gson.convertToModel(jsonString: String, cls: Class<T>): T? {
    return try {
        fromJson(jsonString, cls)
    } catch (e: Exception) {
        null
    }
}

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

참고 : 선언 클래스를 추가하지 말고이 메서드 만 추가하면 모든 것이 잘 작동합니다.

  1. 이제 전화 :

gson의 참조를 만듭니다.

val gson = Gson ()

배열을 json 문자열로 변환하려면 다음을 호출하십시오 .

val jsonString=gson.convertToJsonString(arrayList)

json 문자열에서 배열을 얻으려면 다음을 호출하십시오 .

val arrayList=gson.fromJson<ArrayList<YourModelClassName>>(jsonString)

모델을 json 문자열로 변환하려면 다음을 호출하십시오.

val jsonString=gson.convertToJsonString(model)

json 문자열을 모델로 변환하려면 다음을 호출하십시오.

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.