# Gson

Gson은 Java 객체와 JSON 간의 변환에 사용되는 라이브러리다.

# 의존성

dependencies {
    implementation 'com.google.code.gson:gson:2.8.7'
}

# JsonObject를 문자열로 변환

import com.google.gson.Gson
import com.google.gson.JsonObject

val gson = Gson()

val jsonObject: JsonObject = JsonObject()
jsonObject.addProperty("name", "Paul")
jsonObject.addProperty("age", 20)

val jsonString: String = gson.toJson(jsonObject)  // {"name":"Paul","age":20}

JsonObject은 중첩될 수 있다.

val gson = Gson()

val player1 = JsonObject()
player1.addProperty("name", "Smith")
player1.addProperty("age", 20)

val player2 = JsonObject()
player2.addProperty("name", "John")
player2.addProperty("age", 24)

val players = JsonObject()
players.add("designer", player1)
players.add("programmer", player2)

println(players)  // {"Designer":{"name":"Smith","age":20},"Programmer":{"name":"John","age":24}}

val designer = players.get("designer").asJsonObject  // {"name":"Smith","age":20}
val programmer = players.get("programmer").asJsonObject  // {"name":"John","age":24}

val jsonString: String = gson.toJson(players)  // {"designer":{"name":"Smith","age":20},"programmer":{"name":"John","age":24}}

# 문자열을 JsonObject로 변환

JsonParser를 사용하면 문자열을 JsonObject로 변환할 수 있다.

import com.google.gson.JsonObject
import com.google.gson.JsonParser

val gson = Gson()

val jsonString: String = "{\"name\":\"Paul\",\"age\":20}"
val jsonObject: JsonObject = JsonParser().parse(jsonString).asJsonObject

val name: String = jsonObject.get("name").asString  // Paul
val age: Int = jsonObject.get("age").asInt  // 20

# JsonArray

JsonArray을 사용하면 여러 JsonObject를 배열 형태로 가질 수 있다.

import com.google.gson.Gson
import com.google.gson.JsonArray

val gson = Gson()

val player1 = JsonObject()
player1.addProperty("name", "Smith")
player1.addProperty("age", 20)

val player2 = JsonObject()
player2.addProperty("name", "John")
player2.addProperty("age", 24)

val players = JsonArray()
players.add(player1)
players.add(player2)

println(players)    // [{"name":"Smith","age":20},{"name":"John","age":24}]

val first = players.get(0).asJsonObject  // {"name":"Smith","age":20}
val second = players.get(1).asJsonObject  // {"name":"John","age":24}

val jsonString: String = gson.toJson(players)  // [{"name":"Smith","age":20},{"name":"John","age":24}]

val jsonArray: JsonArray = JsonParser().parse(jsonString).asJsonArray

# Java 객체와 문자열 간 변환

Gson.toJson()을 사용하면 Java 객체를 문자열로 변환할 수 있다.

import com.google.gson.annotations.SerializedName

data class Person (
    @SerialzedName("name") name: String,
    @SerialzedName("id") id: Long,
    @SerialzedName("access_token") accessToken: String
)
import com.google.gson.Gson

val gson = Gson()
val person: Person = Person("Paul", 1, "D123Wcwqe123jkkl2KJ")
val jsonString: String = gson.toJson(person)    // {"name":"Paul","id":1,"access_token":"D123Wcwqe123jkkl2KJ"}

@Expose를 추가하면 특정 필드의 값이 null일 경우 객체를 Json 문자열로 변환할 때 해당 필드를 자동으로 생략해준다.해당 값이 null일 경우, json으로 만들 필드를 자동 생략해 준다.

import com.google.gson.annotations.SerializedName
import com.google.gson.annotations.Expose

data class Person (
    @SerializedName("name") val name: String,
    @SerializedName("id") val id: Long,
    @Expose @SerializedName("access_token") val accessToken: String? = null
)
import com.google.gson.Gson

val gson = Gson()
val person: Person = Person("Paul", 1)
val jsonString: String = gson.toJson(person)    // {"name":"Paul","id":1}

Gson.fromJson()을 사용하면 문자열을 Java 객체로 변환할 수 있다.

val gson = Gson()

val jsonString: String = "{\"name\":\"Paul\",\"id\":1,\"access_token\":\"D123Wcwqe123jkkl2KJ\"}"
val person: Person = gson.fromJson(jsonString, Person::class.java)

println(person.id)  // 1
println(person.name)  // Paul
println(person.accessToken)  // D123Wcwqe123jkkl2KJ