본문

[2017.10.18] 52. JSON 데이터 가공 [라이브러리 사용 X]

도입

이번 포스팅에서는 'JSON'이라는 파일 형태로 데이터를 입력 받아 가공해 데이터를 안드로이드에서 사용해볼 예정이다.

[JSON Data -> Java 클래스 객체]



JSON 데이터 가공[라이브러리 사용 X] 데이터의 흐름

JSON Data를 입력 받아 라이브러리를 사용하지 않고 직접 가공할 예정이다.



실습

※Remote 클래스는 이전 포스팅(http://heepie.tistory.com/144)의 소스 코드를 클래스화 한 것이다.

Remote.class

요청한 페이지의 소스 코드를 읽어 모두 result로 반환하는 클래스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Remote {
    public static String getData(String string) {
        final StringBuilder result = new StringBuilder();
 
        try {
            URL url = new URL(string);
            // openConnection은 ConnectionPool 사용과 같음
            // Conntection
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("GET");
 
            // 통신결과가 성공인지 확인
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // 파일 입출력과 동일
                InputStreamReader isr = new InputStreamReader(conn.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String tmp = "";
                while ((tmp = br.readLine()) != null) {
                    result.append(tmp);
                }
 
                br.close();
                isr.close();
 
            } else {
                Log.e("heepie", conn.getResponseCode()+"");
            }
 
            conn.disconnect();
        } catch (Exception e) {
            Log.e("heepie", e.toString());
        }
 
        return result.toString();
    }
 
    public static Bitmap loadImage(URL url) {
        InputStream is = null;
        try {
            is = url.openStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return BitmapFactory.decodeStream(is);
    }
}
cs



User.class

데이터를 저장하기 위한 Model인 User.class 이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class User {
    private int id;
    private String login;
    private String avatar_url;
 
    // 이미지 처리를 위해 변수 추가 생성 
    private Bitmap bitmap;
 
    public Bitmap getBitmap() {
        return bitmap;
    }
 
    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getLogin() {
        return login;
    }
 
    public void setLogin(String login) {
        this.login = login;
    }
 
    public String getAvatar_url() {
        return avatar_url;
    }
 
    public void setAvatar_url(String avatar_url) {
        this.avatar_url = avatar_url;
    }
}
cs


MainActivity.class

parse 메소드의 역할이 핵심이다. 

Json 데이터를 가공하는 메소드이고 소스 코드를 이해하기보다는 엄청 복잡하다라는 것을 느끼는 것이 중요하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private List<User> data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        initData();
        initView();
        initRecyclerView();
    }
 
    private void initView () {
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    }
 
    private void initData() {
 
        new AsyncTask<Void, Void, List<User>>() {
 
            @Override
            protected List<User> doInBackground(Void... params) {
                String rowData = Remote.getData("https://api.github.com/users");
                return parse(rowData);
            }
 
            @Override
            protected void onPostExecute(List<User> getData) {
                // jsonString을 가공(parsing)
                data = getData;
                initRecyclerView();
            }
        }.execute();
 
    }
 
 
    // 메소드의 목적은 jsonData를 가공해 리스트에 입력하는 메소드
    private List<User> parse(String jsonString) {
        // 가공한 User 클래스를 입력 받을 result 생성
        List<User> result = new ArrayList<>();
 
        jsonString = jsonString.substring(jsonString.indexOf("{"+ 1);
        jsonString = jsonString.substring(0, jsonString.lastIndexOf("}"));
 
        // 각각의 User 클래스 데이터 추출
        String rawUser[] = jsonString.split("\\},\\{");
 
        // User 클래스 안의 1개의 행씩 추출 위한 배열
        String rowData[] = null;
 
        // 1개의 행 안에 key와 value 추출 위한 배열
        String keyAndValue[] = null;
 
        User user;
 
        List<String> values = new ArrayList<>();
        // User 클래스 안의 1개의 행씩 추출
        for(String item : rawUser) {
            rowData = item.split(",");
 
            // 상위 3개 추출
            for (int i=0; i<3; i=i+1) {
                // 1개의 행 안에 key와 value 추출
                keyAndValue = rowData[i].split("\":");
 
                // value만 추출
                values.add(keyAndValue[1]);
            }
 
            // values를 담을 User 클래스 생성
            user = new User();
 
            // values 입력
            user.setLogin(values.get(0).substring(1, values.get(0).length()-1));
            user.setId(Integer.parseInt(values.get(1)));
 
            URL url = null;
            try {
                url = new URL(values.get(2).substring(1, values.get(2).length()-1));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            user.setAvatar_url(values.get(2).substring(1, values.get(2).length()-1));
            user.setBitmap(Remote.loadImage(url));
 
 
            // 생성한 User 클래스 입력
            result.add(user);
 
            // 다음 User 클래스를 위해 values 클리어
            values.clear();
        }
 
        // 가공한 User 데이터 리스트 반환
        return result;
    }
 
    private void initRecyclerView() {
        JsonDataRecyclerAdapter adapter = new JsonDataRecyclerAdapter(this, data);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}
cs



스크린 샷



#JSON 안드로이드 #JSON 데이터 가공 #JSON

공유

댓글