본문
[2017.10.18] 52. JSON 데이터 가공 [라이브러리 사용 X]
컴퓨터/이론: 안드로이드 2017. 10. 18. 09:23
도입
이번 포스팅에서는 '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
'컴퓨터 > 이론: 안드로이드' 카테고리의 다른 글
[2017.10.30] 56. 에뮬레이터(AVD) 키보드 설정 (0) | 2017.10.30 |
---|---|
[2017.10.18] 53. JSON 데이터 가공 [라이브러리(Glide, GSON) 사용 O] (0) | 2017.10.18 |
[2017.10.17] 51. AsyncTask 개념과 실습 (0) | 2017.10.17 |
[2017.10.16] 50. Android와 Web 연결 (0) | 2017.10.16 |
[2017.10.16] 49. Thread간의 데이터 전달 (0) | 2017.10.16 |
댓글