안드로이드 - Json 파싱하기

by 조쉬 posted Apr 02, 2021
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

1.  json 기본 개념

{ "Movies" : [
    {
        "title" : "미션임파서블",
        "grade" : "15세 관람가",
        "category" : "액션"
    },
    {
        "title" : "어벤져스",
        "grade" : "12세 관람가",
        "category" : "액션"
    },
    {
        "title" : "범죄도시",
        "grade" : "19세 관람가",
        "category" : "범죄/스릴러"
    },
    {
        "title" : "",
        "grade" : "",
        "category" : ""
    }
]
} 

▼ json은 위와같은 모습을 가집니다. Json은 name-value 형태의 쌍으로 이루어져 있으며 name과 value는 :으로 연결되어있습니다. name은 String이기 때문에 반드시 큰따옴표("")로 묶어줘야 하며 value는 String형 데이터일 때 큰 따옴표(")로 묶어주면 됩니다. 각 데이터 쌍들의 구분은 쉼표(,)를 사용하여 구분합니다.

"title" : "어벤져스"

▼ 위에서 언급한대로 Json은 name : value 쌍으로 이루어집니다. title이 name에 해당하면 큰 따옴표(")로 감싸 져 있으며 (:) 다음에 value 값이 옵니다. 이때 어벤저스라는 데이터는 String형이기 때문에 큰따옴표(")로 감싸져 있는 것입니다. 위에서는 value 타입이 String이지만 배열(Array)이나 객체(Object) 또는 정수형 같은 다른 타입이 들어갈 수 있습니다. 

{
    "students" : ["김철수", {"전공" : ["프로그래밍", "영어"]}]
}

▼ Json에서 객체(Object)의 시작은 {} 중괄호를 사용하고 배열은 [] 대괄호를 사용합니다. 위 Json 형태를 살펴보면 {} 안에 name:value 쌍으로 이루어진 데이터가 들어갑니다. (객체 {} 안에는 반드시 name:value 쌍이 들어갑니다. ) students와 쌍을 이루는 value는 대괄호를 사용하여 배열이 들어갑니다. 배열의 각 요소는 쉼표(,)를 통해 구분되며 각 요소는 마찬가지로 객체가 오거나 배열 또는 일반적인 String과 같은 타입이 들어갈 수 있습니다. 

 

{ "Movies" : [

    {
        "title" : "미션임파서블",
        "grade" : "15세 관람가",
        "category" : "액션"
    },
    {
        "title" : "어벤져스",
        "grade" : "12세 관람가",
        "category" : "액션"
    },
    {
        "title" : "범죄도시",
        "grade" : "19세 관람가",
        "category" : "범죄/스릴러"
    },
    {
        "title" : "아저씨"
        "grade" : "19세 관람가"
        "category" : "범죄/스릴러"
    }
]
} 

▼ 이제 포스팅 초입에 나왔떤 위 Json 형태의 포맷이 눈에 익으실 겁니다. 가장 먼저 { 를 시작으로 하여 객체가 시작된다는 것을 알려주고 Movies와 쌍으로 value 타입은 배열이 들어갑니다. Movies의 value에 해당하는 배열은 총 4개의 요소를 가지며 각 요소는 {}로 이루어진 객체 타입의 데이터를 가지고 있습니다. 각 배열의 요소 {} 안에는 한 개의 영화 정보를 담기 위한 name:value 쌍으로 이루어진 객체로 이루어져 있습니다.


2. Json 파싱하기

 

 

▼ 영화 정보를 포함하는 Json 형태의 데이터 포맷을 파싱 하여 안드로이드 앱에서 List 형식으로 보여주는 예제를 살펴보겠습니다.


2.1 프로젝트에 Json 파일 추가하기

먼저 안드로이드 프로젝트에서 Json 파일을 추가하는 방법을 살펴보겠습니다. 

 

 

 

▼ Json 파일은 /app/assets/ 경로 아래에 위와 같이 추가합니다. 만약 assets 폴더가 없다면 app 폴더를 우클릭하여 [new] - [Folder] - [Assets Folder]를 클릭하여 폴더를 먼저 생성해줍니다. 폴더가 생성되면 assets 폴더를 우클릭하여 새로운 파일을 생성하고 확장자는. json으로 하여 생성해줍니다. 

 

 


2.2 Json 파일 읽어오기

    private String getJsonString()
    {
        String json = "";

        try {
            InputStream is = getAssets().open("Movies.json");
            int fileSize = is.available();

            byte[] buffer = new byte[fileSize];
            is.read(buffer);
            is.close();

            json = new String(buffer, "UTF-8");
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }

        return json;
    }

▼ Json 파일을 읽어와 파일 내용을 String 변수에 담아 return 하는 getJsonString() 함수입니다. 


2.3 Json 파싱 하기

public class Movie{
    private String title;
    private String Category;
    private String grade;

    public String getTitle() {
        return title;
    }

    public String getCategory() {
        return Category;
    }

    public String getGrade() {
        return grade;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setCategory(String category) {
        Category = category;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

}

▼ Json으로부터 파싱 된 영화 데이터를 담기 위한 클래스입니다. getter/setter 함수를 구현하여 외부에서 각 멤버 변수에 접근 가능하도록 구현합니다.

    private void jsonParsing(String json)
    {
        try{
            JSONObject jsonObject = new JSONObject(json);

            JSONArray movieArray = jsonObject.getJSONArray("Movies");

            for(int i=0; i<movieArray.length(); i++)
            {
                JSONObject movieObject = movieArray.getJSONObject(i);

                Movie movie = new Movie();

                movie.setTitle(movieObject.getString("title"));
                movie.setGrade(movieObject.getString("grade"));
                movie.setCategory(movieObject.getString("category"));

                movieList.add(movie);
            }
        }catch (JSONException e) {
            e.printStackTrace();
        }
    }

 

 

 

 

▼ JsonObject를 먼저 생성합니다. 인자 정보는 Json 포맷의 String형 변수를 넘겨줍니다. 우리는 Movies의 value에 해당하는 배열에 대한 정보가 필요하기 때문에 getJSONArray() 함수를 호출하여 JSONArray 객체를 생성합니다. 그런 다음 JSONArray를 순회하며 각 영화 정보를 가져올 건데 getJSONObject() 함수를 통해 영화 정보에 해당하는 객체를 movieObject 객체가 참조하도록 합니다. key 값을 가져오기 위해서는 getString() 함수를 호출하여 인자 정보로 가져오고자 하는 값에 해당하는 key값을 넘겨주게 됩니다.