Array List를 JSONArray 로 변환
ArrayAdapter 내에서 ListView용으로 사용하는 ArrayList가 있습니다.목록에 있는 아이템을 JSONAray로 변환하여 API로 전송해야 합니다.여기저기 찾아봤지만 이게 어떻게 작동하는지 설명해 줄 만한 건 찾지 못했어요. 어떤 도움이라도 주시면 감사하겠습니다.
업데이트 - 솔루션
이것이 내가 그 문제를 해결하기 위해 하게 된 일이다.
Array List의 객체:
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 컨스트럭터를 올바르게 읽으면 다음과 같이 임의의 컬렉션(arrayList는 컬렉션의 하위 클래스)에서 빌드할 수 있습니다.
ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("baar");
JSONArray jsArray = new JSONArray(list);
참고 자료:
- jsonarray 컨스트럭터:http://developer.android.com/reference/org/json/JSONArray.html#JSONArray%28java.util.Collection%29
- 컬렉션 : http://developer.android.com/reference/java/util/Collection.html
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();
}
}
}
Kotlin과 Gson을 사용하면 더 쉽게 할 수 있습니다.
- 먼저 Gson 의존관계를 추가합니다.
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
- 별도 작성
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)
주의: 선언 클래스를 추가하지 말고 이러한 메서드만 추가하면 모든 것이 정상적으로 작동합니다.
- 문의처:
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)
그래들 추가:
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
변환ArrayList로.JsonArray
JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);
이미 답변이 끝난 것은 알고 있습니다만, 여기에서는 다음 코드를 사용하는 것이 좋습니다.
for ( Field f : context.getFields() ) {
if ( f.getType() == String.class ) || ( f.getType() == String.class ) ) {
//DO String To JSON
}
/// And so on...
}
이렇게 하면 수동으로 입력하지 않고도 클래스에서 변수에 액세스할 수 있습니다.
더 빠르고 더 나은...이게 도움이 됐으면 좋겠다.
건배 : D
다음은 Jackson과의 해결책입니다.
Object Mapper를 사용하여 JSON 문자열을 수신한 후 문자열을 JSONArray로 변환할 수 있습니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONArray;
List<CustomObject> myList = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(myList);
JSONArray jsonArray = new JSONArray(jsonString);
필드가 많을 때 OP의 응답을 개선하면 필드 열거를 사용하여 일부 코드를 잘라낼 수 있습니다(단, 리플렉션이 더 느리다는 것을 알 수 있습니다).
public JSONObject getJSONObject() {
JSONObject obj = new JSONObject();
Field[] fields = ListItem.class.getDeclaredFields();
for (Field f : fields) {
try {
obj.put(f.getName(), f.get(ListItem.this));
} catch (JSONException | IllegalAccessException e) {
}
}
return obj;
}
언급URL : https://stackoverflow.com/questions/4841952/convert-arraylistmycustomclass-to-jsonarray
'programing' 카테고리의 다른 글
| 다단계 메뉴와 같은 워드프레스 기능 (0) | 2023.03.06 |
|---|---|
| 기능 컴포넌트: 컴포넌트 내부 또는 외부 중 어느 쪽에 쓰기 기능을 사용합니까? (0) | 2023.03.06 |
| Oracle에서 에일리어스를 정의하려면 'as' 키워드가 필요합니까? (0) | 2023.03.06 |
| null 유효 JSON(4바이트, 기타 없음) (0) | 2023.03.06 |
| .js 파일 내에서 PHP 코드 실행 (0) | 2023.03.06 |