Kotlin에서 JSON 문자열을 객체로 구문 분석

David Mbochi Njonge 2023년1월30일
  1. 새 프로젝트 생성 및 종속성 추가
  2. kotlinx.serialization 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
  3. org.json 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
  4. Gson 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
  5. Jackson 라이브러리를 사용하여 Kotlin에서 JSON 문자열을 객체로 구문 분석
  6. 결론
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, lastNameemail 매개변수가 있는 데이터 클래스입니다.

이 매개변수는 데이터를 저장하므로 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, lastNameemail 필드를 사용하여 사용자 지정 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를 생성합니다. 그런 다음 ObjectMapperreadValue() 메서드를 호출하고 JSON 문자열을 첫 번째 인수로 전달하고 매핑되는 class를 두 번째 인수로 전달합니다.

readValue() 메서드는 JSON 문자열을 역직렬화하고 메서드의 두 번째 인수로 전달된 객체 유형을 반환합니다.

코드를 실행하여 콘솔에 다음 개체를 문자열로 기록하는지 확인합니다.

Vehicle(vehicleName=Toyota, vehicleColor=white, vehiclePrice=10000)

결론

이 튜토리얼에서는 JSON 객체를 Kotlin 객체로 파싱하는 방법을 배웠습니다. 우리가 다룬 접근 방식에는 kotlix.serialization 라이브러리, org.json 라이브러리, Gson 라이브러리 및 Jackson 라이브러리 사용이 포함됩니다.

이러한 라이브러리가 동일한 목표를 실현하는 데 사용할 수 있는 유일한 라이브러리가 아니므로 다른 라이브러리와 함께 애플리케이션을 자유롭게 구현하십시오.

David Mbochi Njonge avatar David Mbochi Njonge avatar

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