본문으로 바로가기

[Scala] 스칼라 Json 변환 작업 (play-json)

category Backend/Scala 2022. 2. 4. 13:45

1. play-json 라이브러리 추가

name := "untitled"

version := "0.1"

scalaVersion := "2.12.15"

// https://mvnrepository.com/artifact/com.typesafe.play/play-json
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"

2. JSON 예시

  • 실습으로 사용할 json String 데이터는 다음과 같습니다.
{
	"class": "A",
	"grade": "1",
	"members": [{
		"name": "kim",
		"score": "80"
	}, {
		"name": "lee",
		"score": "84"
	}, {
		"name": "jang",
		"score": "65"
	}]
}

var jsonString = "{\"class\":\"A\",\"grade\":\"1\",\"members\":[{\"name\":\"kim\",\"score\":\"80\"},{\"name\":\"lee\",\"score\":\"84\"},{\"name\":\"jang\",\"score\":\"65\"}]}";

2. Json 핸들링

  • class와 grade 값을 가지고 오는 예시입니다.

[Json String To JsObject]

: Json.parse를 이용하여 Json 문자열을 JsObject로 변환합니다.

jsonString = "json 문자열"
var jsonObject = Json.parse(jsonString)

 

[JsObject 특정 키의 값 추출]

var value = (jsonObject \ "key").as[String]

 

[JsObject]

String(Key), JsValue 형태의 Map = Map[String, JsValue]

import play.api.libs.json.{Json}

object JsonTest {
  def main(args: Array[String]): Unit = {
    var jsonString = "{\"class\":\"A\",\"grade\":\"1\",\"member\":[{\"name\":\"kim\",\"score\":\"80\"},{\"name\":\"lee\",\"score\":\"84\"},{\"name\":\"jang\",\"score\":\"65\"}]}";

    // Json String to JsObject
    var jsonObject = Json.parse(jsonString)
    println(jsonObject)
    println(jsonObject.getClass) // JsObject

    // class value 추출
    var classValue = (jsonObject \ "class").as[String]
    println(classValue)

    // grade value 추출
    var gradeValue = (jsonObject \ "grade").as[String]
    println(gradeValue)
  }
}

3. Json Array 핸들링

  • Json Array 형태인 members의 값을 가지고 오는 예시입니다.
  • Json Array 같은 경우엔 Json.parse()를 이용해 파싱 할 경우 JsArray 객체로 반환받습니다. 반환받은 JsArray는 Scala의 ArrayBuffer로 변환하여 핸들링하면 편리합니다. 
import play.api.libs.json.{JsArray, Json}

object JsonTest {
  def main(args: Array[String]): Unit = {
    var jsonString = "{\"class\":\"A\",\"grade\":\"1\",\"members\":[{\"name\":\"kim\",\"score\":\"80\"},{\"name\":\"lee\",\"score\":\"84\"},{\"name\":\"jang\",\"score\":\"65\"}]}";

    // Json String to JsObject
    var jsonObject = Json.parse(jsonString)

    // String JsonArray To JsArray
    var jsonArrayJsArray = (jsonObject \ "members").get
    println(jsonArrayJsArray.getClass) // JsArray

    // JsArray to ArrayBuffer
    var jsonArray = jsonArrayJsArray.asInstanceOf[JsArray].value
    println(jsonArray.getClass) // ArrayBuffer

    println(jsonArray.size)
    println(jsonArray(0))
    println(jsonArray(1))
    println(jsonArray(2))

    // ArrayBuffer Element JsObject
    var jsonArrayElement = jsonArray(0)
    println(jsonArrayElement.getClass) //JsObject

    var name = (jsonArray(0) \ "name").as[String]
    var score = (jsonArray(0) \ "score").as[String]
    println(name)
    println(score)

    // foreach value
    jsonArray.foreach(l => {
      println((l \ "name").as[String] + " : " + (l \ "score").as[String])
    })
  }
}