android:json파싱하기
json파싱하기
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 다음 판 | 이전 판 | ||
| android:json파싱하기 [2024/09/17 21:44] – 만듦 이거니맨 | android:json파싱하기 [2025/04/23 23:37] (현재) – 이거니맨 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| + | ===== JSON 쓰기 ===== | ||
| + | |||
| + | ==== 1. 원칙 ==== | ||
| + | |||
| + | 처음에 JSONObject를 선언한 후, put함수로 값을 지정하면 JSON을 쓰게 된다. | ||
| + | |||
| + | <code kotlin> | ||
| + | // 최상단 JSON | ||
| + | val jsonDoc = JSONObject() | ||
| + | |||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 2. 다층구조 JSON ==== | ||
| + | |||
| + | JSON을 다층구조로 쓰기 위해서는 먼저, 하위 JSON을 위의 방식으로 만든 후에, | ||
| + | |||
| + | 이를 다시 put함수로 넣어주면 된다. | ||
| + | |||
| + | 아래 예제는 Custom Class를 하위구조로 하여 다층 JSON구조를 만든 것이다. | ||
| + | |||
| + | |||
| + | <code kotlin> | ||
| + | // Json 구조 만들기 | ||
| + | fun setJsonElement(ofAssault: | ||
| + | { | ||
| + | |||
| + | // 폭행 종류 JSON | ||
| + | val jsonAssault = JSONObject() | ||
| + | try { | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | jsonAssault.put(" | ||
| + | |||
| + | } catch (e: JSONException) { | ||
| + | // TODO Auto-generated catch block | ||
| + | e.printStackTrace() | ||
| + | } | ||
| + | |||
| + | // 상대와의 관계 | ||
| + | val jsonVictimRelation = JSONObject() | ||
| + | try { | ||
| + | jsonVictimRelation.put(" | ||
| + | jsonVictimRelation.put(" | ||
| + | jsonVictimRelation.put(" | ||
| + | jsonVictimRelation.put(" | ||
| + | jsonVictimRelation.put(" | ||
| + | jsonVictimRelation.put(" | ||
| + | jsonVictimRelation.put(" | ||
| + | |||
| + | } catch (e: JSONException) { | ||
| + | // TODO Auto-generated catch block | ||
| + | e.printStackTrace() | ||
| + | } | ||
| + | |||
| + | // 최상단 JSON | ||
| + | val jsonDoc = JSONObject() | ||
| + | |||
| + | try { | ||
| + | |||
| + | jsonDoc.put(" | ||
| + | jsonDoc.put(" | ||
| + | jsonDoc.put(" | ||
| + | |||
| + | } catch (e: Exception) { | ||
| + | // TODO Auto-generated catch block | ||
| + | e.printStackTrace() | ||
| + | } | ||
| + | // val str = jsonDoc.toString() | ||
| + | // | ||
| + | // Log.d(" | ||
| + | |||
| + | return jsonDoc.toString() | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 3. 데이터 클라스 ==== | ||
| + | |||
| + | 위에 쓰인 데이터클라스의 모양은 다음과 같다. | ||
| + | |||
| + | <code kotlin> | ||
| + | // 폭행의 종류 | ||
| + | data class KindOfAssault( | ||
| + | |||
| + | var checkFamily : Boolean = false, // 가정폭력 | ||
| + | var checkDating : Boolean = false, | ||
| + | var checkEnfant : Boolean = false, | ||
| + | var checkSchool : Boolean = false, | ||
| + | var checkSenior : Boolean = false, | ||
| + | var checkMedical : Boolean = false, | ||
| + | var checkAirplane : Boolean = false, // 항공기 내 폭행 | ||
| + | var checkDriver : Boolean = false, // 운전자 폭행 | ||
| + | var checkAssault : Boolean = false // 일반 폭행 | ||
| + | |||
| + | ) | ||
| + | |||
| + | // 피고소인과의 관계 | ||
| + | data class RelationshipWithVictim( | ||
| + | var spouse : Boolean = false, | ||
| + | var parents : Boolean = false, // 존속 | ||
| + | var family : Boolean = false, // 배주자 및 존속을 제외한 가족 | ||
| + | var lover : Boolean = false, // 연인, 데이팅 폭력 | ||
| + | var friend : Boolean = false, // 친구, 학교폭력 | ||
| + | var unaquaintance : Boolean = false, // 모르는 사람 | ||
| + | var etc : Boolean = false, // 기타 | ||
| + | var etcDetail : String = " | ||
| + | ) | ||
| + | |||
| + | // 피해상태 | ||
| + | data class StatusOfTrauma( | ||
| + | var bloated : Boolean = false, // 부어오름(부종) | ||
| + | var blooded : Boolean = false, // 피가 남 | ||
| + | var brokenBone : Boolean = false, // 뼈가 부러짐 | ||
| + | var bruise : Boolean = false, // 멍 | ||
| + | var nothing : Boolean = false, // 외부 상처 없음 | ||
| + | var etc : Boolean = false, // 기타 | ||
| + | var etcDetail: String = " | ||
| + | ) | ||
| + | |||
| + | // 폭행 방법 | ||
| + | data class MethodOfBattery( | ||
| + | var collar : Boolean = false, // 멱살잡다 | ||
| + | var push : Boolean = false, // 밀침 | ||
| + | var pull : Boolean = false, // 잡아당김 | ||
| + | var punch : Boolean = false, // 주먹으로 때림 | ||
| + | var kick : Boolean = false, // 발로 참 | ||
| + | var throwing : Boolean = false, // 물건을 던짐 | ||
| + | var throwingDetail : String = "", | ||
| + | var waffe : Boolean = false, // 흉기를 휘두름 | ||
| + | var waffeDetail : String = "", | ||
| + | var etc : Boolean = false, // 기타 | ||
| + | var etcDetail: String = "", | ||
| + | ) | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 4. 배열(JSON Array) ==== | ||
| + | |||
| + | 배열로 저장하고 싶으면 JSON Array를 선언해 주고, 여기에 JSON 모델을 집어넣으면 된다. 다음 예제를 참고하라. | ||
| + | |||
| + | <code kotlin> | ||
| + | // JSON Array로 스트링 만들기 | ||
| + | fun writeJsonArray(answerTexts : ArrayList< | ||
| + | |||
| + | |||
| + | //JsonArray 생성 | ||
| + | val jArray: JSONArray = JSONArray() | ||
| + | |||
| + | answerTexts.forEach() { | ||
| + | // 폭행 종류 JSON | ||
| + | val jsonAnswer = JSONObject() | ||
| + | try { | ||
| + | jsonAnswer.put(" | ||
| + | jsonAnswer.put(" | ||
| + | jsonAnswer.put(" | ||
| + | |||
| + | jArray.put(jsonAnswer) | ||
| + | } catch (e: JSONException) { | ||
| + | // TODO Auto-generated catch block | ||
| + | e.printStackTrace() | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | return jArray.toString() | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| ===== Json 읽기 ===== | ===== Json 읽기 ===== | ||
| + | |||
| + | ==== 1. 원칙 ==== | ||
| + | |||
| + | 읽기는 위의 쓰기의 반대로 하면 된다. | ||
| + | |||
| + | |||
| + | 어떠한 해당 string을 json으로 받아오는 것은 다음과 같다 . | ||
| + | |||
| + | |||
| + | <code kotlin> | ||
| + | val jsonElementObject = JSONObject(sueItem.jsonElements) | ||
| + | </ | ||
| + | |||
| + | |||
| + | json으로 받아온 후 특정한 키 값을 받아오는 것은 다음과 같다. | ||
| + | |||
| + | <code kotlin> | ||
| + | val jsonElementObject = JSONObject(sueItem.jsonElements) | ||
| + | val jsonAssault = jsonElementObject.getString(" | ||
| + | val attackedDate by remember { mutableStateOf(jsonAssault).toString())} | ||
| + | |||
| + | </ | ||
| + | |||
| + | 근데, 실무상으로는 getString()함수를 쓰기보다는 optString(키값, | ||
| + | |||
| + | 만약 해당 키값이 JSON에 없으면 null 값으로 인하여 크래시가 발생하기 떄문이다. optString()은 만약 JSON에 해당 키값이 없으면 대체단어로 대체를 해준다. | ||
| + | |||
| + | 따라서 위 예제는 아래와 같이 해주는게 좋다. | ||
| + | |||
| + | <code kotlin> | ||
| + | val jsonElementObject = JSONObject(sueItem.jsonElements) | ||
| + | val jsonAssault = jsonElementObject.optString(" | ||
| + | val attackedDate by remember { mutableStateOf(jsonAssault).toString())} | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 2. 특정 하위구조를 읽어오기 ==== | ||
| + | |||
| + | 특정한 Custom한 Class를 JSON에서 받아 오는 것은 다음과 같다. | ||
| + | <code kotlin> | ||
| + | // 폭행 종류 JSON 받아오기 | ||
| + | fun getJsonAssault(jsonObject: | ||
| + | |||
| + | |||
| + | val jsonAttackObject = jsonObject.getJSONObject(" | ||
| + | |||
| + | |||
| + | |||
| + | val valueOfKindOfAssault : KindOfAssault = KindOfAssault( | ||
| + | checkFamily = jsonAttackObject.optString(" | ||
| + | checkDating = jsonAttackObject.optString(" | ||
| + | checkEnfant = jsonAttackObject.optString(" | ||
| + | checkSchool = jsonAttackObject.optString(" | ||
| + | checkSenior = jsonAttackObject.optString(" | ||
| + | checkMedical = jsonAttackObject.optString(" | ||
| + | checkAirplane = jsonAttackObject.optString(" | ||
| + | checkDriver = jsonAttackObject.optString(" | ||
| + | checkAssault = jsonAttackObject.optString(" | ||
| + | ) | ||
| + | |||
| + | Log.d(" | ||
| + | |||
| + | return valueOfKindOfAssault | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 3. 해당 JSON요소가 없을 경우를 대비한 에러처리 추가 ==== | ||
| + | |||
| + | 만약 JSON카테고리가 없을 경우 위의 optstring과 같은 기능을 하는 함수가 필요하다. 따라서 다음과 같이 고쳐주면 된다. | ||
| + | |||
| + | <code kotlin> | ||
| + | // 폭행 방법 JSON 받아오기 | ||
| + | fun getJsonMethodOfBattery(jsonObject: | ||
| + | |||
| + | // 만약 없는 경우 더미를 만들기 | ||
| + | if (jsonObject.isNull(" | ||
| + | { | ||
| + | // 피해상태 | ||
| + | val jsonMethod = JSONObject() | ||
| + | try { | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | jsonMethod.put(" | ||
| + | |||
| + | jsonObject.put(" | ||
| + | }catch (e: JSONException) { | ||
| + | e.printStackTrace() | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // JSON 받아오기 | ||
| + | val jsonMethodObject = jsonObject.getJSONObject(" | ||
| + | |||
| + | val valueOfMethod : MethodOfBattery = MethodOfBattery( | ||
| + | collar = jsonMethodObject.optString(" | ||
| + | push = jsonMethodObject.optString(" | ||
| + | pull = jsonMethodObject.optString(" | ||
| + | punch = jsonMethodObject.optString(" | ||
| + | kick = jsonMethodObject.optString(" | ||
| + | throwing = jsonMethodObject.optString(" | ||
| + | throwingDetail = jsonMethodObject.optString(" | ||
| + | waffe = jsonMethodObject.optString(" | ||
| + | waffeDetail = jsonMethodObject.optString(" | ||
| + | etc = jsonMethodObject.optString(" | ||
| + | etcDetail = jsonMethodObject.optString(" | ||
| + | ) | ||
| + | |||
| + | return valueOfMethod | ||
| + | } | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 4. 배열로 읽어 오기 ==== | ||
| + | |||
| + | 배열로 읽는 것은 다음과 같이 하면 된다. | ||
| + | |||
| + | <code kotlin> | ||
| + | // 스트링에서 JSON 배열을 돌려주는 함수 | ||
| + | fun getJsonAnswerText(jsonText : String) : ArrayList< | ||
| + | |||
| + | try { | ||
| + | val jsonArray = JSONArray(jsonText) | ||
| + | |||
| + | val textArray = ArrayList< | ||
| + | |||
| + | for (i in 0 until jsonArray.length()) { | ||
| + | val jsonObject = jsonArray[i] as JSONObject | ||
| + | |||
| + | val valueOfAnswer : AnswerText = AnswerText( | ||
| + | text = jsonObject.optString(" | ||
| + | correctness = jsonObject.optString(" | ||
| + | index = jsonObject.optString(" | ||
| + | |||
| + | ) | ||
| + | |||
| + | textArray.add(valueOfAnswer) | ||
| + | } | ||
| + | |||
| + | return textArray | ||
| + | }catch (e: JSONException) { | ||
| + | // TODO Auto-generated catch block | ||
| + | e.printStackTrace() | ||
| + | } | ||
| + | | ||
| + | // 아래 코드는 만약에 에러가 날 경우에만 돌려주는 더미 배열이다. | ||
| + | val textArray = ArrayList< | ||
| + | |||
| + | return textArray | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== 참고 ===== | ||
| ==== 1. Json 스트링에서 Json 요소 읽기 ==== | ==== 1. Json 스트링에서 Json 요소 읽기 ==== | ||
| 줄 121: | 줄 465: | ||
| </ | </ | ||
| + | |||
| + | ===== 응용 ===== | ||
| + | |||
| + | [[android: | ||
android/json파싱하기.1726577095.txt.gz · 마지막으로 수정됨: 저자 이거니맨
