티스토리 뷰

개요

  • Java, Kotlin은 매우 강력한 정적 타입 언어이지만 때때로 요구사항에 따라 동적으로 변화되는 객체를 다뤄야하는 상황에 직면할 때가 있다. Map, List, JSON 문자열의 String 타입이 가장 대표적인 예인데, 이 데이터들을 읽어들이고 추가, 수정하는 것은 여간 번거로운 일이 아닐 수 없다. Jayway JsonPath를 이용하면 Path 기반으로 굉장히 우아하고 손쉬운 방법으로 데이터를 제어할 수 있다.

build.gradle.kts

  • 프로젝트 루트의 build.gradle.kts 파일에 아래 내용을 추가한다.
dependencies {
    implementation("com.jayway.jsonpath:json-path:2.5.0")
}

JsonPath 객체 초기화

  • 원본 소스로부터 JsonPath를 초기화할 차례이다.
// JsonPath 객체 생성
// 아규먼트에는 Map<String, Any>, List<Any>, JSON String 모두 가능
val inputJsonPath = JsonPath.parse(input)
  • JsonPath.parse()JSON 문자열을 담은 String 타입을 아규먼트로 받을 수 있다. (유효한 JSON 문자열이 아닐 경우, com.jayway.jsonpath.InvalidJsonException 예외가 발생한다.) 또한, 동적 데이터를 저장한 Map<String, Any>, List<String> 타입을 아규먼트로 받을 수 있다.

JsonPath 데이터 조회

  • .read()를 이용하여 복잡한 경로의 데이터를 쉽게 조회할 수 있다.
// foo.bar 배열을 List로 반환
// Path가 존재하지 않을 경우 com.jayway.jsonpath.PathNotFoundException 예외 발생
inputJsonPath.read("$['foo']['bar']") as List<Map<String, Any>>

// foo.bar 배열의 총 개수를 반환
// Path가 존재하지 않을 경우 com.jayway.jsonpath.PathNotFoundException 예외 발생
inputJsonPath.read("$['foo']['bar'].length()") as Int

JsonPath 데이터 추가/수정

  • .put()을 이용하여 데이터의 추가/수정을, set()을 이용하여 데이터 수정이 가능하다.
// 루트의 foo.bar = foobar로 수정, 없으면 새로 생성
inputJsonPath.put("$['foo']", "bar", "foobar")

// foo.bar = foobar로 수정, 없으면 무시
inputJsonPath.set("$['foo']['bar']", "foobar")
  • .put()Path가 존재하지 않을 경우 무시한다. Key가 존재하지 않으면 새로 생성하고, 존재하면 기존의 값을 덮어쓰기한다.
  • .set()Path가 존재하지 않을 경우 무시한다. (부모 Path가 존재하지 않으면 com.jayway.jsonpath.PathNotFoundException 예외가 발생한다.) 즉, Key가 존재해야만 기존의 값을 덮어쓰기한다.

JsonPath 결과 데이터 획득

  • .json(), .jsonString()을 이용하여 결과 데이터를 획득할 수 있다.
// 결과물을 Map으로 생성
val outputMap = inputJsonPath.json() as Map<String, Any>

// 결과물을 JSON String으로 생성
val outputJsonString = inputJsonPath.jsonString()
  • 최종 결과물에 대해 .json()Map<String, Any> 또는 List<String>으로 타입 변환이 가능하다.
  • 최종 결과물에 대해 .jsonString()JSON 문자열을 담은 String 타입을 반환한다.

참고 글

댓글
댓글쓰기 폼