마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

JSONArray형태로 파싱되지 않습니다. 도움부탁드립니다.

0 추천

안녕하세요, 질문드립니다.

OpenAPI에서 다음과 같은 JSON형태가 담긴 url주소를 받아와 파싱하려고 합니다.

[

  {

    id: "id_one"

    name: "name_one"

  },

  {

    id: "id_one"

    name: "name_one"

  }

]

위와같이 하나의 큰 배열 안에, 여러개의 object로 구성된 JSON 형태입니다.

 

URL url = new URL("openAPI URL");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

현재는 위와 같은 방식으로 json데이터를 한줄씩 받아와 파싱하고 있습니다.

 

현재 구현하고 싶은 것은, 

JSONArray형태로 json을 받아와

JSONObject jsonObj = (JSONObject)jsonArray.get(i);

위와 같은 형식으로 i번째 Object를 받아오는 것입니다.

 

 

String 형태여야지 JSONArray형태로 만들 수 있는 것 같아, 아래와같이 object를 String 형태로 바꾼 뒤 JSONArray형태로 변경하려 해도 오류가 생깁니다.

String url = "https://static.api.nexon.co.kr/fifaonline4/latest/spid.json";
URL postUrl = new URL(url);
HttpsURLConnection con = (HttpsURLConnection)postUrl.openConnection();
Object obj = JSONValue.parse(new InputStreamReader(con.getInputStream()));
String str = obj.toString();

JSONArray jsonArray = new JSONArray(str); 
//String을 JSONArray형태로 만들려고 했지만 오류(Unhandled exception: org.json.JSONException)
JSONObject jsonObject = jsonArray.getJSONObject(i);

 

아직 초보여서 질문을 자세하게 못한점 양해부탁드립니다.

 

carvalho (140 포인트) 님이 2022년 6월 19일 질문

2개의 답변

0 추천
괜히 JSON 파싱하느라 고생하지 마시고 Gson같은 라이브러리를 사용하세요. 훨씬 쉽고 안전합니다. 그리고  HttpURLConnection 보다는 Volley, Retrofit 같은 라이브러리를 사용하시는게 더 좋구요. HttpURLConnection은 쓸데없는 코드도 많이 작성해야 하고, 백그라운드 쓰레드를 처리해 주지 않기 때문에 별도의 쓰레딩 작업을 해주어야 합니다. 메인쓰레드에서 IO처리를 하는 건 모바일 앱에서 기본적으로 피하는 안티패턴이예요.
spark (224,800 포인트) 님이 2022년 6월 19일 답변
https://developer.android.com/reference/org/json/JSONArray#getJSONObject(int)
https://developer.android.com/reference/org/json/JSONArray#optJSONObject(int)
(JSONObject)jsonArray.get(i); 대신에 위의 메소드 둘 중의 하나를 사용하시는게 맞을 것 같은데요. JsonValue.parse가 뭘하는 메소드인지도 올리셔야 할 거 같은데요. 메소드 이름만 보면 JSON을 파싱해서 필요한 오브젝트형태로 변환하는건데, 그렇지 않은 것 같네요.
0 추천

HttpURLConnection을 이용하여 해당 URL 테스트해 봤는데,  별 이상없이 동작을 합니다. 아래는 테스트해본 코드입니다. 코드가 정돈된 상태가 아니니 필요하다면 참고하시고 다듬어 사용하시기 바랍니다.

public class Person {
    private final String id;
    private final String name;

    public static Person from(JSONObject jsonObject) {
        String id = jsonObject.optString("id", "");
        String name = jsonObject.optString("name", "");
        return new Person(id, name);
    }

    private Person(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}


//에러처리는 요구사항에 맞게 수정할 것.
private void fetchData() {
        String urlString = "https://static.api.nexon.co.kr/fifaonline4/latest/spid.json";
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(urlString);
            urlConnection = (HttpURLConnection) url.openConnection();

            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            String jsonString = readStream(in);
            if (jsonString == null) {
                // TODO : 에러처리
                return;
            }
            parsePersonList(jsonString);
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) urlConnection.disconnect();
        }
    }

    private String readStream(InputStream in) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(in));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } catch (IOException) {
            e.printStackTrace();
            try {
                br.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    private List<Person> parsePersonList(String jsonString) throws JSONException {
        List<Person> result = new ArrayList<>();

        JSONArray jsonArray = new JSONArray(jsonString);
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObj = jsonArray.getJSONObject(i);
            result.add(Person.from(jsonObj));
        }

        return result;
    }

 

spark (224,800 포인트) 님이 2022년 6월 19일 답변
spark님이 2022년 6월 19일 수정
...