오늘은 json 파싱에 대해 알아 볼건데요.
기본적으로 json은 [](대괄호) 와 {}(중괄호) 로 나뉘어 있는데요.
{"food_list":[{"code":"F3J01","seq_code":102,"food_name":"32도 숙성 양조진간장"}]}
이런 데이터가 있다고 가정합시다. (데이터스토어의 식품api중 일부입니다.)
[]대괄호는 JSONArray 를 이용하여 구별하고 {}중괄호는 JSONObject 를 이용하여 구별합니다.
정확한 사용법을 알아 보겠습니다.
메인 액티비티 입니다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.parsetext);
String resultText = "값이없음";
try {
resultText = new Task().execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
textView.setText(resultText);
}
}
api를 통신을 통해 가져오기위해 AsyncTask 를 사용합니다.
public class Task extends AsyncTask<string, void, string> {
String clientKey = "#########################";
;
private String str, receiveMsg;
private final String ID = "########";
@Override
protected String doInBackground(String... params) {
URL url = null;
try {
url = new URL("http://api.dbstore.or.kr:8880/foodinfo/list.do?uid=" + ID + "&n=10&p=1&c=F3J01&s=food_name&o=u");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
conn.setRequestProperty("x-waple-authorization", clientKey);
if (conn.getResponseCode() == conn.HTTP_OK) {
InputStreamReader tmp = new InputStreamReader(conn.getInputStream(), "UTF-8");
BufferedReader reader = new BufferedReader(tmp);
StringBuffer buffer = new StringBuffer();
while ((str = reader.readLine()) != null) {
buffer.append(str);
}
receiveMsg = buffer.toString();
Log.i("receiveMsg : ", receiveMsg);
reader.close();
} else {
Log.i("통신 결과", conn.getResponseCode() + "에러");
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return receiveMsg;
}
}
통신을 하기위해서는 기본적으로 인터넷 퍼미션을 열어줘야합니다.
json 값을 받아오기위한 Task 클래스입니다. (이번 예제는 데이터스토어의 api를 이용하였습니다.)
이렇게 json 값을 받아오면
{"food_list":[{"code":"F3J01","seq_code":102,"food_name":"32도 숙성 양조진간장","thumb_img":"http://api.eatsight.com/FoodData/client_thumb/F3J01102_TOP.jpg","sell_com":"씨제이제일제당(주)","barcode":"8801007081496","volume":"940 ml","food_type":"양조간장","ing_first":""},
{"code":"F3J01","seq_code":19,"food_name":"32도숙성 양조간장","thumb_img":"http://api.eatsight.com/FoodData/client_thumb/F3J0119_TOP.jpg","sell_com":"씨제이제일제당(주)","barcode":"8801007081441","volume":"1.6L","food_type":"양조간장","ing_first":""}...
이런식으로 값을 받아옵니다.
이런 데이터를 우리는 파싱을 통해 필요한 데이터만 가공하여 사용할건데요.
public String[] foodlistjsonParser(String jsonString) {
String seq_code = null;
String food_name = null;
String code = null;
String kcal = null;
String sell_com = null;
String thumb_img = null;
String food_type = null;
String barcode = null;
String volume = null;
String[] arraysum = new String[8];
try {
JSONArray jarray = new JSONObject(jsonString).getJSONArray("food_list");
for (int i = 0; i < jarray.length(); i++) {
HashMap map = new HashMap<>();
JSONObject jObject = jarray.getJSONObject(i);
code = jObject.optString("code");
seq_code = jObject.optString("seq_code");
food_name = jObject.optString("food_name");
thumb_img = jObject.optString("thumb_img");
sell_com = jObject.optString("sell_com");
barcode = jObject.optString("barcode");
volume = jObject.optString("volume");
food_type = jObject.optString("food_type");
arraysum[0] = code;
arraysum[1] = seq_code;
arraysum[2] = food_name;
arraysum[3] = thumb_img;
arraysum[4] = sell_com;
arraysum[5] = barcode;
arraysum[6] = volume;
arraysum[7] = food_type;
}
} catch (JSONException e) {
e.printStackTrace();
}
return arraysum;
}
Task 의 결과로 얻어진 가공되지 않은 값을을 jsonparser 메소드로 넘겨준뒤 가공을 합니다.
메소드 안에서는 JSONArray 로 {"food_list":[{"code":"F3J01","seq_code":102,"food_name":"32도 숙성 양조진간장"}]}
[] 앞의 food_list로 []를 구별한뒤
[]안의 값들을 JSONObject 로 {} 안의 값들을 태그별로 나누는 작업을 합니다. (태그는 "code":"F3J01","seq_code":102 중 code, seq_code )
가공을 하게되면 이렇게 태그별로 나눠진 값을 알 수 있습니다.
'개인 공부' 카테고리의 다른 글
RN 을 좀 더 빠르게 만들어보자 (0) | 2020.04.20 |
---|---|
용어 정리 모음 (0) | 2019.12.30 |
안드로이드 뷰페이저 + 탭레이아웃 정리 블로그 (0) | 2019.10.12 |
안드로이드 다음 주소 검색 이슈 (0) | 2019.10.07 |
MVVM 패턴 ( 데이터 바인딩 )예제 1 (0) | 2019.09.23 |