Json Array를 일반 Java 목록으로 변환


130

안드로이드 ListView 데이터 바인딩을 위해 JSON 배열을 일반 Java 배열로 변환하는 방법이 있습니까?


8
재미있는 점은 org.JSONArray후드 아래에서 ArrayList 를 사용 한다는 것입니다 The arrayList where the JSONArray's properties are kept. 따라서 대부분의 루핑은 많은 경우 (캡슐화를 위해) 아무 것도 수행되지 않습니다.
Christophe Roussy

답변:


186
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 

5
for 루프에 닫는 괄호가 없습니다 ... 편집을 시도했지만 승인을 통과하기에는 문자가 충분하지 않습니다. 오 잘! 참고로
Matt K

실제로 누락되지 않았지만 응답자는 방금 함수의 열기 및 닫기 괄호로 코드 덩어리를 붙여 넣었습니다.
Sarim Javaid Khan

1
jsonArray.get(i)구문 분석의 결과로 null을 반환 하면 어떻게됩니까 [ "String 1", null, "String 2" ]? 그렇다면 루프 충돌이 발생하지 않습니까?
dbm

감사. 하나가 울리면 JSONArray를 JSONArray로 만들 수 있습니다. jsonArray = new JSONArray (yourString); 나머지 코드는 동일하게 유지됩니다.
Kaushik Lele

구현에 따라 size()대신에 필요할 수 있습니다 length().

57

아직 JSONArray 객체가 없으면

JSONArray jsonArray = new JSONArray(jsonArrayString);

그런 다음 루프를 반복하여 자체 배열을 작성하십시오. 이 코드는 문자열 배열이라고 가정하므로 특정 배열 구조에 맞게 수정하기가 어렵지 않습니다.

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

2
죄송합니다, 맞습니다-Lists와 JSONArrays를 혼동하고 있습니다. :) 실제로 JSONArray.length ()입니다.
Nick

13

번들로 제공되는 org.json라이브러리 를 사용하는 대신 Jackson 또는 GSON을 사용하십시오. 잭슨의 경우 f.ex :

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);

11

어쩌면 그것은 해결 방법 일뿐이지만 (매우 효율적이지는 않지만) 다음과 같이 할 수 있습니다.

String[] resultingArray = yourJSONarray.join(",").split(",");

분명히 ' ,'구분 기호 를 원하는대로 바꿀 수 있습니다 ( JSONArray이메일 주소가 있습니다)


8
데이터에 구분 문자가 포함되어 있지 않아야합니다. 그렇지 않으면 데이터가 손상 될 수 있습니다.
Artemix

1
결과는 문자열이어야합니다.
Nicolas Tyler

하나의 라이너, 완벽합니다.
zeeshan 2016 년

4

사용하는 String[]대신 다음을 사용할 수 있습니다 ArrayList<String>.

ArrayList의 메모리 오버 헤드가 줄어 듭니다.

그것이 도움이되기를 바랍니다!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}

3

Java Streams를 사용 IntStream하면 객체 매핑을 사용할 수 있습니다 .

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());

0

나는 질문이 JSONArray에 관한 것이라는 것을 알고 있지만 여기에 JSONArray를 사용하여 JSONObject에서 객체를 추출 할 필요가없는 경우 유용한 예제가 있습니다.

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

String jsonStr = "{\"types\":[1, 2]}";
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
List<Long> list = (List<Long>) json.get("types");
if (list != null) {
    for (Long s : list) {
        System.out.println(s);
    }
}

문자열 배열에서도 작동


0

API에서 데이터를 가져 오는 경우 더 나은 방법이 있습니다. 그런 다음 JSON을 구문 분석하고 목록보기에로드하십시오.

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

                        for (int i = 0; i < jsonArray.length(); i++) {

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...

0

우리는 변환에서 시작합니다 [JSONArray-> List <JSONObject>]

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

다음으로 array.getJSONObject (i ++)를 POJO로 대체하는 일반 버전을 만듭니다.

예 :

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
        throws JSONException {
  ArrayList<Tt> tObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
       );
  return tObjects;
}

private static T createT(Class<T> forCLass, JSONObject jObject) {
   // instantiate via reflection / use constructor or whatsoever 
   T tObject = forClass.newInstance(); 
   // if not using constuctor args  fill up 
   // 
   // return new pojo filled object 
   return tObject;
}

0

String[]대신에 사용할 수 있습니다 ArrayList<String>:

그것이 도움이되기를 바랍니다!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }


0

JSON을 읽기 쉬운 문자열로 변환하고 String 클래스의 "분할"메소드를 사용하여 분할 할 수 있습니다.

String jsonAsString = yourJsonArray.toString();
//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
//split wherever the String contains ","
String[] jsonAsStringArray = jsonAsString.split("\",\"");

-2

나는 그 질문에 대한 것임을 알고있다 Java. 그러나 Kotlin유용하다고 생각 하기 때문에 가능한 해결책을 공유하고 싶습니다 .

Kotlin을 사용하면 a JSONArray를 네이티브 (Kotlin) 배열로 변환하는 확장 함수를 작성할 수 있습니다 .

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

이제 인스턴스에서 asArray()직접 호출 할 수 있습니다 JSONArray.


-3

java.util.Arrays는 어떻습니까?

List<String> list = Arrays.asList((String[])jsonArray.toArray())

15
문서에 toArray()방법 이 없습니다 JSONArray(). json.org/javadoc/org/json/JSONArray.html 이 질문은 아마도 간단한 질문이 없었을 것 toArray()입니다.
javajavajavajavajava

1
net.sf.json.JSONArray에는 toArray () 메소드가 있으므로이 응답은이 JSON 라이브러리에서 작동합니다. 질문은 사용 된 라이브러리를 지정하지 않았습니다.
ilinca
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.