code

Jackson Scala 모듈의 작은 예

starcafe 2023. 3. 29. 21:40
반응형

Jackson Scala 모듈의 작은 예

Scala 모듈 2.10을 사용한 Jackson의 시리얼화/디시리얼화의 간단한 예를 소개해 주시겠습니까?필드별 주석이나 할당이 필요 없는 리플렉션 기반의 JSON을 찾고 있습니다.이렇게 하면 될 것 같은데 문서에는 예가 포함되어 있지 않습니다.

케이스 클래스가 있는 경우:

case class Person(name:String, age:Int)
val person = Person("Fred", 65)

그래서 그들의 gitub readme에서:

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)

좋아, 이제 어쩌지?p를 JSON으로/JSON에서 변환하려면 어떻게 해야 하나요?

한 번 시도해 보세요.

val person = Person("fred", 25)
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)    

val out = new StringWriter
mapper.writeValue(out, person)
val json = out.toString()
println(json)

val person2 = mapper.readValue(json, classOf[Person])
println(person2)

편집

꼭 선언해 주세요.Person그렇지 않으면 작동하지 않습니다.

다음은 완전한 예입니다.

package com.example.samples

import org.junit.Test
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.context.annotation.Bean
import java.io.File
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import java.io.StringWriter

class JacksonTest {

  @Test
  @throws[Exception] def jacksonTest(): Unit = {

    //case class Person(var name: String = "", var age: Int = 0)
    //case class Person(@Bean var name: String, @Bean var age: Int)
    case class Person( name: String, age: Int )

    val person = Person("fred", 25)
    val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)

    val out = new StringWriter
    mapper.writeValue(out, person)
    val json = out.toString()
    println(json)

    val person2 = mapper.readValue(json, classOf[Person])
    println(person2)
  }
}

그러나 mapper.readValue에서는 실패합니다.

설정은 다음과 같습니다.

<!-- Jackson libraries for JSON marshalling and unmarshalling -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.2.3</version>
</dependency>

<!-- Jackson module for scala object marshalling and unmarshalling -->
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-scala_2.10</artifactId>
    <version>2.2.2</version>
</dependency>

<!-- Scala Compiler -->
<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-compiler</artifactId>
    <version>2.10.2</version>
</dependency>

왜 실패했는지 아십니까?작업 예시와 차이를 알 수 없습니다.

변환할 일반 함수를 만들었습니다.JSON String to Case Class/Object그리고.Case Class/Object to JSON String.

에서 필요한 SBT 의존관계build.sbt파일:

name := "jackson-example"

scalaVersion := "2.12.11"

libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.10.1"
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.1"

케이스 클래스/오브젝트에 대한 JSON 문자열

def fromJson[T](json: String)(implicit m: Manifest[T]): Option[T] = {
    Try {
      lazy val mapper = new ObjectMapper() with ScalaObjectMapper
      mapper.registerModule(DefaultScalaModule)
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
      mapper.readValue[T](json)
    } match {
      case Success(x) => Some(x)
      case Failure(err) => {
        logger.error("@@@@Got " + err.getMessage() + " while JSON to Object:--> " + json)
        None
      }
    }
  }

케이스 클래스/오브젝트에서 JSON 문자열로의

def toJson[T](obj: T)(implicit m: Manifest[T]): Option[String] = {
    Try {
      lazy val mapper = new ObjectMapper() with ScalaObjectMapper
      mapper.registerModule(DefaultScalaModule)
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
      mapper.writeValueAsString(obj)
    } match {
      case Success(x) => Some(x)
      case Failure (err) => {
        logger.error("@@@@Got " + err.getMessage() + " while converting object  to JSON:--> " + obj)
        None
      }
    }
  }

언급URL : https://stackoverflow.com/questions/16966743/small-example-of-jackson-scala-module

반응형