programing

케이스 클래스에 필드가 1개뿐인 경우 json을 케이스 클래스로 전환하는 방법

newstyles 2023. 3. 15. 19:26

케이스 클래스에 필드가 1개뿐인 경우 json을 케이스 클래스로 전환하는 방법

놀이에서는 2.1 읽기를 사용하여 Json을 객체에 마샬링합니다.그러나 케이스 클래스에 필드가1개밖에 없는데 어떻게 하면 좋을까요?하나의 필드 'and'는 사용되지 않으므로 더 많은 필드에 대해 작동하는 IDE가 작동하지 않습니다.따라서 Function Builder를 얻을 수 없습니다.

다음 코드는 타입 미스매치를 나타냅니다.어떻게 하면 고칠 수 있을까요?

case class Data(stamm: Seq[String])


implicit val dataReads  = (
  (__ \ "stamm").read(Reads.list[String])
)(Data)

Julien이 대답한 바와 같이 싱글필드 케이스클래스는 다음과 같이 읽을 수 있습니다.

case class Person(name: String)

val personReads: Reads[Person] = 
  (__ \ "name").read[String].map { name => Person(name) }

다음과 같은 내용을 기입하려면 보충 자료만 작성하십시오.

val personWrites: Writes[Person] = 
  (__ \ "name").write[String].contramap { (person: Person) => person.name }

또는 형식(읽기 및 쓰기):

val personFormat: Format[Person] = 
  (__ \ "name").format[String].inmap(name => Person(name), (person: Person) => person.name)

쓰기 및 포맷의 경우 다음을 Import해야 합니다.

import play.api.libs.functional.syntax._

Json 콤비네이터는 단일 필드 케이스 클래스에는 사용할 수 없습니다.

Pascal(이 API의 작성자)은 이 상황을 https://groups.google.com/forum/?from groups=#!starred/play-framework/hGrveOkbJ6U에서 설명하고 있습니다.

다음과 같은 몇 가지 해결 방법이 있습니다.

case class A(value: List[Int])
val areads = (__ \ 'value).read[List[Int]].map{ l => A(l) } // covariant map

@yokomizor의 답변에 기초하여, 저는 가장 간단한 솔루션을 찾았습니다.Formatter되려고

case class Person(name: String)
val personFormatter: Format[Person] =
  (__ \ "full_name").format[String].inmap(Person.apply, unlift(Person.unapply))

인정된 솔루션보다 더 심플한편안한 솔루션:

case class A(value: String)
val reads = (__ \ "key").read[String].map(A.apply)

언급URL : https://stackoverflow.com/questions/14754092/how-to-turn-json-to-case-class-when-case-class-has-only-one-field