android:json파싱하기
json파싱하기
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
android:json파싱하기 [2024/09/17 21:44] – 만듦 이거니맨 | android:json파싱하기 [2024/12/22 01:33] (현재) – 이거니맨 | ||
---|---|---|---|
줄 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 = "", | ||
+ | ) | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
===== 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 | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 참고 ===== | ||
==== 1. Json 스트링에서 Json 요소 읽기 ==== | ==== 1. Json 스트링에서 Json 요소 읽기 ==== | ||
줄 121: | 줄 390: | ||
</ | </ | ||
+ | |||
+ | ===== 응용 ===== | ||
+ | |||
+ | [[android: |
android/json파싱하기.1726577095.txt.gz · 마지막으로 수정됨: 2024/09/17 21:44 저자 이거니맨