728x90

네이버 지도 API 기능을 학습하려고 구글링하다보니 Gson 라이브러리를 사용한 코드가 있어서 이참에 Gson 라이브러리를 테스트하고 정리해둔다.


1. Gson 라이브러리 최신버전 구하는 곳 : https://github.com/google/gson

   에 가면 최신버전의 정보가 나온다.

   단순하게 toJson() and fromJson() 메소드로 Java 객체를 JSON으로 변환하고

   SON 을 Java 객체로 변환하는 라이브러리 를 목표로 한다고 나온다.


2. 안드로이드 스튜디오에서 Gson 라이브러리를 이용하려면

   앱 build.gradle 파일내 dependencies 에 코드 한줄 추가하면 된다.

   compile 'com.google.code.gson:gson:2.8.2'



FileList_Item Class

- 변수명을 서버 JSON 변수명과 동일하게 처리하라.



Gson 라이브러리를 사용하지 않고 서버 데이터를 가져와서 RecyclerView 에 보여주는 코드중에서 비교할 수 있는 것만 발췌했다.


Gson 라이브러리 사용 이전 코드


listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성
audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅

코드 부분을 onCreate 에 추가하고 listViewAdapter.notifyDataSetChanged(); 를 하면 JSON Array 데이터가 RecyclerView 에 잘 보인다.


Gson 라이브러리 사용 코드



Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType();
fileList = gson.fromJson(audiofiles.toString(), listType);


검색해보면 위 코드 3줄이면 해결된다고 모두 답변이 되어 있다. 그런데도 불구하고 RecyclerView 에 출력되지 않았다.


서버에서 가져온 JSON Array 데이터를 ArrayList 에 추가하는 코드가 매우 간단해진다는 건 알았다.

상위폴더 ArrayList 를 별도로 만들 필요가 없는 경우에는 매우 유용할 거 같다.

Stackoverflow 에 질문한 내용을 검색해보니 RecyclerView 에 데이터 보이지 않는다고 질의한 사항이 몇건 있었다.  System.out.println 으로 찍어보면 데이터가 ArrayList에 정상적으로 추가되어 있다. 그러나 화면에 보이지 않았다.


Android RecyclerView JSON Parsing using Retrofit 게시글을 보니까 ArrayList 데이터를 추가하고 난 후 바로 다음 줄에 아래 2줄을 적어준 걸 보고 시도했더니 폰 화면에 정상적으로 출력된다.

listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성
audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅

Gson 라이브러리를 사용하면 JSON Array 데이터를 String으로 하나하나 분리할 필요없이 ArrayList에 바로 추가할 수 있어 코드가 심플해지는거 같다.

단, Class 에서 생성한 변수명과 서버(PHP)에서 json_encode로 생성한 변수명이 동일해야 하는거 같다.

서버에서 생성한 데이터가 JSON Object 가 아니라 JSON Array 면 코드가 더 심플해질 수 있는거 같다.


상위폴더를 안드로이드 Java 코드에서 생성한 것을 없애고, 서버 PHP 코드에서 구현하는 것으로 변경하고 테스트를 해보니 정상적으로 잘 처리된다.


코드 줄어든 것만 발췌하여 비교한다.

=== Gson 라이브러리 미사용 코드 ===

// 서버 정보를 파싱하기 위한 변수 선언
private static final String TAG_RESULTS="result";
private static final String TAG_fileNAME = "fileName";
private static final String TAG_filePATH ="filePath";
private static final String TAG_curPATH ="curPath";
private static final String TAG_isFile ="isFile";
JSONArray audiofiles = null;

protected void showList(String jsonData) {
    try {
        JSONObject jsonObj = new JSONObject(jsonData);
        audiofiles = jsonObj.getJSONArray(TAG_RESULTS);

        fileList.clear(); // 서버에서 가져온 데이터 초기화
        for(int i = 0; i < audiofiles.length(); i++){
            JSONObject c = audiofiles.getJSONObject(i);
            final String fileName = c.getString(TAG_fileNAME);
            final String filePath = c.getString(TAG_filePATH);
            final String curPath = c.getString(TAG_curPATH);
            final String isFile = c.getString(TAG_isFile);

            // 서버에서 가져온 데이터 저장
            FileAllList(fileName, filePath, curPath, isFile);
        }

        runOnUiThread(new Runnable() { // 화면에 반영하기 위하여 runOnUiThread()를 호출하여 실시간 갱신한다.
            @Override
            public void run() {
                // 갱신된 데이터 내역을 어댑터에 알려줌
                listViewAdapter.notifyDataSetChanged();
            }
        });
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

// 파일 리스트 추가를 위한 메소드
public void FileAllList(String fileName, String filePath, String curPath, String isFile){
    FileList_Item item = new FileList_Item();
    item.setFileName(fileName);
    item.setFilePath(filePath);
    item.setCurPath(curPath);
    item.setIsFile(isFile);
    fileList.add(item);
}

=== Gson 라이브러리 사용한 코드 ====

 // 서버 정보를 파싱하기 위한 변수 선언
private static final String TAG_RESULTS="result";
JSONArray audiofiles = null;

protected void showList(String jsonData) {
    JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonData);
        audiofiles = jsonObj.getJSONArray(TAG_RESULTS);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    fileList.clear(); // 서버에서 가져온 데이터 초기화
    Gson gson = new Gson();
    Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType();
    fileList = gson.fromJson(audiofiles.toString(), listType);
    listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성
    audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
}



정리 핵심

Gson gson = new Gson();
JSONArray jsonArray = new JSONArray(JSONdata);
Type listType = new TypeToken<ArrayList<FileList_Item>>(){}.getType();
ArrayList<FileList_Item> myFileList = gson.fromJson(jsonArray.toString(), listType);


블로그 이미지

Link2Me

,