[android] ArrayList <MyCustomClass>를 JSONArray로 변환

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"}]

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



답변

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

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

참조 :


답변

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

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


답변

누군가가 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);


답변

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

    }


답변

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

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

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

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

건배. :디


답변

gradle에 추가하십시오.

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

변환 ArrayListJsonArray

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


답변

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)