Scala 2.10 + Json 시리얼화 및 디시리얼화
Scala 2.10은 (적어도 당분간은) Jerkson이나 lift-json과 같은 오래된 라이브러리의 일부를 망가뜨린 것 같습니다.
사용방법은 다음과 같습니다.
case class Person(name: String, height: String, attributes: Map[String, String], friends: List[String])
//to serialize
val person = Person("Name", ....)
val json = serialize(person)
//to deserialize
val sameperson = deserialize[Person](json)
그러나 Scala 2.10에서 작동하는 Json을 생성하고 역직렬화하는 좋은 기존 방법을 찾는 데 어려움을 겪고 있습니다.
Scala 2.10에서 이를 수행하는 베스트 프랙티스 방법이 있습니까?
Jackson은 JSON을 빠르게 처리하기 위한 Java 라이브러리입니다.Jerkson 프로젝트는 Jackson을 감싸지만 포기된 것처럼 보인다.잭슨의 스칼라 모듈로 바꿔서 네이티브 스칼라 데이터 구조로 직렬화 및 역직렬화했습니다.
이 기능을 이용하려면 , 다음의 항목을 포함시켜 주세요.build.sbt
:
libraryDependencies ++= Seq(
"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.1.3",
...
)
그러면 당신의 예는 다음 잭슨 래퍼에서 말 그대로 동작합니다(잭슨-모듈-스칼라 테스트 파일에서 추출했습니다).
import java.lang.reflect.{Type, ParameterizedType}
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.`type`.TypeReference;
object JacksonWrapper {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
def serialize(value: Any): String = {
import java.io.StringWriter
val writer = new StringWriter()
mapper.writeValue(writer, value)
writer.toString
}
def deserialize[T: Manifest](value: String) : T =
mapper.readValue(value, typeReference[T])
private [this] def typeReference[T: Manifest] = new TypeReference[T] {
override def getType = typeFromManifest(manifest[T])
}
private [this] def typeFromManifest(m: Manifest[_]): Type = {
if (m.typeArguments.isEmpty) { m.runtimeClass }
else new ParameterizedType {
def getRawType = m.runtimeClass
def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray
def getOwnerType = null
}
}
}
다른 Scala 2.10 JSON 옵션에는 Programming Scala Book을 기반으로 한 Twitter의 Scala-json이 포함되어 있습니다.이것은 간단하지만, 퍼포먼스를 희생하고 있습니다.파싱에 데친 것을 사용하는 spray-json도 있습니다.마지막으로 Play의 JSON 핸들링은 좋아 보이지만 Play 프로젝트에서 쉽게 분리되지 않습니다.
Jackson, lift-json 또는 자체 네이티브 구현을 장기 솔루션으로 설명하는 json4:
나는 스칼라에서 json 서포트에 아르고나우트를 진심으로 추천할 수 있다.Customer 객체를 시리얼화하기 위해 설정할 필요가 있는 것은 다음 한 줄뿐입니다.
implicit lazy val CodecCustomer: CodecJson[Customer] =
casecodec6(Customer.apply, Customer.unapply)("id","name","address","city","state","user_id")
그렇게 하면 네 학급이 더 잘 할 수 있을 거야.asJson
스트링으로 변환하는 메서드입니다.또한 문자열 클래스에 메서드를 제공하기 위해 pimping을 수행합니다..decodeOption[List[Customer]]
를 참조해 주세요.당신의 클래스에 있는 옵션들은 잘 처리됩니다.다음은 합격 테스트와 실행 중인 메인 메서드를 가진 노동자 계층입니다.이러한 메서드는, 모든 것이 정상적으로 동작하는 것을 확인하기 위해서, argonaut의 git 클론에 드롭 할 수 있습니다.
package argonaut.example
import org.specs2.{ScalaCheck, Specification}
import argonaut.CodecJson
import argonaut.Argonaut._
case class Customer(id: Int, name: String, address: Option[String],
city: Option[String], state: Option[String], user_id: Int)
class CustomerExample extends Specification with ScalaCheck {
import CustomerExample.CodecCustomer
import CustomerExample.customers
def is = "Stackoverflow question 12591457 example" ^
"round trip customers to and from json strings " ! {
customers.asJson.as[List[Customer]].toOption must beSome(customers)
}
}
object CustomerExample {
implicit lazy val CodecCustomer: CodecJson[Customer] =
casecodec6(Customer.apply, Customer.unapply)("id","name","address","city","state","user_id")
val customers = List(
Customer(1,"one",Some("one street"),Some("one city"),Some("one state"),1)
, Customer(2,"two",None,Some("two city"),Some("two state"),2)
, Customer(3,"three",Some("three address"),None,Some("three state"),3)
, Customer(4,"four",Some("four address"),Some("four city"),None,4)
)
def main(args: Array[String]): Unit = {
println(s"Customers converted into json string:\n ${customers.asJson}")
val jsonString =
"""[
| {"city":"one city","name":"one","state":"one state","user_id":1,"id":1,"address":"one street"}
| ,{"city":"two city","name":"two","state":"two state","user_id":2,"id":2}
| ,{"name":"three","state":"three state","user_id":3,"id":3,"address":"three address"}
| ,{"city":"four city","name":"four","user_id":4,"id":4,"address":"four address"}
|]""".stripMargin
var parsed: Option[List[Customer]] = jsonString.decodeOption[List[Customer]]
println(s"Json string turned back into customers:\n ${parsed.get}")
}
}
개발자들은 또한 사람들이 시작하는 것을 돕고 반응합니다.
현재 https://github.com/randhindi/jerkson에 Scala 2.10을 지원하는 Jerkson 포크가 있습니다.
따라서 오류 메시지가 없고 샘플 코드가 올바르지 않은 것으로 보아 리프트-json 추출이 어떻게 작동하는지 이해하지 못하는 것이 더 큰 문제일 것으로 생각됩니다.제가 오해했다면 댓글 달아주세요.내가 맞다면, 여기 네가 필요한 게 있어.
직렬화 방법:
import net.liftweb.json._
import Extraction._
implicit val formats = DefaultFormats
case class Person(...)
val person = Person(...)
val personJson = decompose(person) // Results in a JValue
다음으로 프로세스를 되돌리려면 다음과 같은 작업을 수행합니다.
// Person Json is a JValue here.
personJson.extract[Person]
만약 그 부분이 문제가 되지 않는다면, 저에게 알려주시면 제가 더 도움이 될 수 있도록 답변을 수정해 보겠습니다.
언급URL : https://stackoverflow.com/questions/12591457/scala-2-10-json-serialization-and-deserialization
'programing' 카테고리의 다른 글
페이지 수 계산의 페이지 수 논리 (0) | 2023.04.02 |
---|---|
연결 및 라우터 문제 (0) | 2023.04.02 |
C#에서 Oracle 스토어드 프로시저를 호출하시겠습니까? (0) | 2023.04.02 |
JSON과 Objective-C를 해석하려면 어떻게 해야 하나요? (0) | 2023.04.02 |
GridFS는 실전 가동에 충분한 속도와 신뢰성을 갖추고 있습니까? (0) | 2023.04.02 |