Kotlin에서 JSON 문자열을 객체로 구문 분석
- 새 프로젝트 생성 및 종속성 추가
-
kotlinx.serialization
라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석 -
org.json
라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석 - Gson 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
- Jackson 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
- 결론
JSON은 JavaScript Object Notation의 약자로 클라이언트-서버 아키텍처에서 컴퓨터 간에 데이터를 전송하거나 데이터베이스에 데이터를 저장하는 데 사용하는 데이터 교환 형식입니다.
JSON 데이터는 데이터베이스에 저장된 데이터에 대해 CRUD 작업을 수행하기 위해 서버에 HTTP 요청을 발행하는 REST API를 사용하여 사용됩니다. 예를 들어 웹 페이지나 모바일 애플리케이션에서 데이터를 동적으로 로드할 때 일반적으로 데이터베이스에서 이 데이터를 JSON으로 검색하고 데이터를 개체로 구문 분석하고 각 개체 변수를 보기에 표시합니다.
이 튜토리얼에서는 JSON 데이터를 Kotlin의 객체로 구문 분석하는 데 사용할 수 있는 다양한 방법을 배웁니다.
새 프로젝트 생성 및 종속성 추가
새 프로젝트를 생성하려면 Intellij로 이동하여 File > New > Project
를 선택하십시오. 열리는 창에서 프로젝트 이름으로 kotlinSerialization
을 입력하고 언어 섹션에서 Kotlin
을 선택하고 빌드 시스템 섹션에서 Gradle
을 선택합니다.
Create
버튼을 눌러 새 프로젝트를 생성하십시오. 프로젝트가 생성되면 build.gradle.kts
파일로 이동하여 다음 종속성이 있는지 확인하십시오.
dependencies {
implementation ("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3")
implementation ("com.google.code.gson:gson:2.9.0")
implementation("org.json:json:20220320")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3")
testImplementation(kotlin("test"))
}
각 종속성은 각 구현을 생성하는 데 사용하는 API를 제공하므로 해결되지 않은 참조 오류를 피하기 위해 모든 종속성이 있는지 확인하십시오.
kotlinx.serialization
라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
이 예에서는 build.gradle.kts
파일의 플러그인 섹션에 다음 플러그인이 있는지 확인해야 합니다.
plugins {
kotlin("jvm") version "1.7.0"
kotlin("plugin.serialization") version "1.7.0"
}
Kotlin 파일이 생성될 프로젝트의 kotlin
폴더 아래에 com/serialize
폴더 구조를 생성합니다.
serialize
폴더 아래 UsingKotlinx.kt
라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.
package com.serialize
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
val employeeJSON = """
{
"firstName": "john",
"lastName": "doe",
"email": "john@gmail.com"
}
""".trimIndent()
@Serializable
data class Employee(val firstName: String,
val lastName: String,
val email: String)
fun main(args: Array<String>){
//Decode employee from string
val employeeObject = Json.decodeFromString<Employee>(employeeJSON);
println(employeeObject);
}
위의 코드에서 우리는 직원 개체를 나타내기 위해 Kotlin의 삼중 따옴표 붙은 텍스트를 사용하여 JSON 개체의 여러 줄 텍스트를 만들었습니다. trimIndent()
메소드는 모든 입력 행의 공통
들여쓰기를 제거하고 공백인 경우 첫 행과 마지막 행을 제거합니다.
그런 다음 Employee
클래스를 만들고 @Serializable
주석으로 주석을 달았습니다. Employee
클래스는 firstName
, lastName
및 email
매개변수가 있는 데이터 클래스입니다.
이 매개변수는 데이터를 저장하므로 data
키워드입니다. 데이터 클래스를 사용할 때 toString()
과 같은 메서드를 선언하지 않고 바로 얻을 수 있으며 이는 데이터를 콘솔에 기록할 때 매우 중요합니다.
@Serializable
주석은 Employee
클래스를 직렬화할 수 있도록 합니다. 즉, 데이터베이스, 파일에 저장하거나 네트워크를 통해 전송할 수 있는 형식으로 변경할 수 있습니다.
JSON 객체를 Kotlin 객체로 구문 분석하기 위해 Json
에서 decodeFromString()
일반 메서드를 호출합니다. 직원 객체를 반환하고 싶기 때문에 Employee
클래스를 유형 매개변수에 전달하고 JSON 문자열을 메소드 인수로 전달합니다.
print
문은 구문 분석된 개체를 콘솔에 기록합니다. 코드를 실행하고 아래와 같이 개체가 콘솔에 문자열로 기록됩니다.
Employee(firstName=john, lastName=doe, email=john@gmail.com)
org.json
라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
이 예에서는 org.json
라이브러리에서 제공하는 JSONObject
API를 활용합니다. 이 라이브러리는 종속성을 추가할 때 애플리케이션에 포함되었습니다.
serialize
폴더 아래 UsingJSONObject.kt
라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.
package com.serialize
import org.json.JSONObject
val usersArray = """
{
"User":[
{
"firstName": "john",
"lastName": "doe",
"email": "john@gmail.com"
},
{
"firstName": "mary",
"lastName": "public",
"email": "mary@gmail.com"
}
]
}
""".trimIndent()
class User{
var firstName: String? = null;
var lastName: String? = null;
var email: String? = null
override fun toString(): String {
return "User(firstName=$firstName, lastName=$lastName, email=$email)"
}
}
fun main() {
val userJsonObject =
JSONObject(usersArray)
val userObject = userJsonObject
.getJSONArray("User");
for (i in 0 until(userObject!!.length())){
val theUser = User();
val firstName = userObject
.getJSONObject(i)
.getString("firstName");
theUser.firstName = firstName
val lastName = userObject
.getJSONObject(i)
.getString("lastName")
theUser.lastName = lastName
val email = userObject
.getJSONObject(i)
.getString("email")
theUser.email = email;
println(theUser);
}
}
첫 번째 및 두 번째 단계는 이전 예제에서 다룬 단계와 유사하지만 이 클래스는 JSON 객체의 배열을 생성하고 일반 Kotlin 클래스를 사용합니다. 이 예제에서는 데이터 클래스를 사용하지 않기 때문에 firstName
, lastName
및 email
필드를 사용하여 사용자 지정 toString()
메서드를 만들어야 합니다.
JSON 배열을 검색하기 위해 JSONObject()
생성자를 호출하고 JSON 문자열을 생성자의 인수로 전달합니다. 생성자는 {
로 시작하고 }
로 끝나는 문자열에서 JSON 개체를 생성합니다. 문자열에 오류가 있으면 JSONException
이 발생합니다.
JSON 개체에 액세스하면 해당 속성을 인수로 전달하여 원하는 속성을 검색할 수 있습니다. 사용자 배열을 검색하기 위해 반환된 객체에서 getJSONArray()
메서드를 호출하고 메서드의 인수로 User
를 전달합니다.
이 메서드는 개체에서 사용자의 JSONArray
를 반환합니다.
JSONArray
에서 Kotlin 객체 생성은 루프를 사용하여 수동으로 수행됩니다. 객체의 인덱스를 메서드의 인수로 전달하여 getJSONObject()
메서드를 사용하여 배열에서 각 객체를 검색합니다.
이 객체에서 각 변수를 검색하고 각 반복에 대해 생성된 새 Kotlin 객체에 할당합니다. 응용 프로그램을 실행하여 다음 문자열 개체를 출력하는지 확인합니다.
User(firstName=john, lastName=doe, email=john@gmail.com)
User(firstName=mary, lastName=public, email=mary@gmail.com)
Gson 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
serialize
폴더 아래에 UsingGson.kt
파일을 만들고 다음 코드를 파일에 복사하여 붙여넣습니다.
package com.serialize
import com.google.gson.Gson
val customerObject = """
{
"firstName": "john",
"lastName": "doe",
"email": "john@gmail.com"
}
""".trimIndent()
class Customer{
private val firstName: String? = null;
private val lastName: String? = null;
private val email: String? = null;
override fun toString(): String {
return "Customer(firstName=$firstName, lastName=$lastName, email=$email)"
}
}
fun main() {
val theGson = Gson();
val customer = theGson
.fromJson(customerObject, Customer::class.java);
println(customer);
}
첫 번째 단계는 객체의 JSON 표현을 생성하고 두 번째 단계는 문자열에서 Kotlin 객체를 생성하는 데 사용할 클래스를 생성한다는 점을 이해했을 것입니다.
기본 메소드는 Gson()
생성자를 호출하여 기본 구성으로 Gson 객체를 생성합니다.
JSON 문자열을 Kotlin 객체에 매핑하려면 Gson 객체에서 fromJson()
메서드를 호출하고 메서드의 첫 번째 인수로 JSON 문자열을 전달하고 메서드의 두 번째 매개변수로 class
를 전달합니다.
fromJson()
메소드는 제네릭이며 메소드의 두 번째 인수로 전달된 객체 유형을 반환합니다. 이 메서드는 파일에서 JSON 개체 읽기와 같은 다른 구현을 제공하기 위해 오버로드되기도 합니다.
프로그램을 실행하고 콘솔에 다음 문자열 개체를 기록합니다.
Customer(firstName=john, lastName=doe, email=john@gmail.com)
Jackson 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
serialize
폴더 아래 UsingJackson.kt
라는 이름의 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.
package com.serialize
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
val vehicleObject = """
{
"vehicleName": "Toyota",
"vehicleColor": "white",
"vehiclePrice": 10000
}
""".trimIndent()
data class Vehicle(private val vehicleName: String,
private val vehicleColor: String,
private val vehiclePrice: Int)
fun main() {
val jacksonMapper = jacksonObjectMapper();
val vehicle = jacksonMapper
.readValue(vehicleObject, Vehicle::class.java)
println(vehicle);
}
이 코드에서는 JSON 개체를 나타내는 문자열과 문자열을 Kotlin 개체에 매핑하는 데 사용할 클래스를 만들었습니다. 클래스에서 생성된 속성은 JSON 문자열의 키와 동일해야 합니다.
Jackson 라이브러리를 사용하기 위해 메인 메소드에서 jacksonObjectMapper()
를 호출하여 ObjectMapper
를 생성합니다. 그런 다음 ObjectMapper
의 readValue()
메서드를 호출하고 JSON 문자열을 첫 번째 인수로 전달하고 매핑되는 class
를 두 번째 인수로 전달합니다.
readValue()
메서드는 JSON 문자열을 역직렬화하고 메서드의 두 번째 인수로 전달된 객체 유형을 반환합니다.
코드를 실행하여 콘솔에 다음 개체를 문자열로 기록하는지 확인합니다.
Vehicle(vehicleName=Toyota, vehicleColor=white, vehiclePrice=10000)
결론
이 튜토리얼에서는 JSON 객체를 Kotlin 객체로 파싱하는 방법을 배웠습니다. 우리가 다룬 접근 방식에는 kotlix.serialization
라이브러리, org.json
라이브러리, Gson
라이브러리 및 Jackson
라이브러리 사용이 포함됩니다.
이러한 라이브러리가 동일한 목표를 실현하는 데 사용할 수 있는 유일한 라이브러리가 아니므로 다른 라이브러리와 함께 애플리케이션을 자유롭게 구현하십시오.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub