복붙노트

[SCALA] 플레이 프레임 워크 2.X에 포함 된 개체의 암시 JSON의 기록 기능을 구현하는 방법

SCALA

플레이 프레임 워크 2.X에 포함 된 개체의 암시 JSON의 기록 기능을 구현하는 방법

두 클래스 푸과 바있다. 푸 바의 필드가 포함되어 있습니다. 어떻게 내가 암시 JSON을 구현합니까되는 문제는 Foo 클래스에 대한 기록?

여기에 코드입니다 :

package models

import play.api.libs.json._

case class Foo(id: String, bar: Bar)

object Foo {
  implicit val implicitFooWrites = new Writes[Foo] {
    def writes(foo: Foo): JsValue = {
      Json.obj(
        "id" -> foo.id,
        "bar" -> foo.bar
      )
    }
  }
}

case class Bar(x: String, y: Int)

object Bar {
  implicit val implicitBarWrites = new Writes[Bar] {
    def writes(bar: Bar): JsValue = {
      Json.obj(
        "x" -> bar.x,
        "y" -> bar.y
      )
    }
  }
}

내가 컴파일 할 때, 나는 다음과 같은 오류가 발생합니다 :

내가 models.Bar 클래스에 대한 암시 적 쓰기를 구현하기 때문에 나는이 컴파일러 오류를 이해하지 않습니다. 문제는 여기에 무엇입니까?

해결법

  1. ==============================

    1.그것은 가시성의 질문, 암시 적 쓰기를 [푸] 당신이 암시 글을 바] 그것을 볼 수 제작되지 않은 선언 할 때 :

    그것은 가시성의 질문, 암시 적 쓰기를 [푸] 당신이 암시 글을 바] 그것을 볼 수 제작되지 않은 선언 할 때 :

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    import play.api.libs.json._
    
    case class Bar(x: String, y: Int)
    
    object Bar {
      implicit val implicitBarWrites = new Writes[Bar] {
        def writes(bar: Bar): JsValue = {
          Json.obj(
            "x" -> bar.x,
            "y" -> bar.y
          )
        }
      }
    }
    
    case class Foo(id: String, bar: Bar)
    
    object Foo {
    
      import Bar._
    
      implicit val implicitFooWrites = new Writes[Foo] {
        def writes(foo: Foo): JsValue = {
          Json.obj(
            "id" -> foo.id,
            "bar" -> foo.bar
          ) 
        } 
      }     
    }
    
    // Exiting paste mode, now interpreting.
    
    import play.api.libs.json._
    defined class Bar
    defined module Bar
    defined class Foo
    defined module Foo
    
    scala> Json.prettyPrint(Json.toJson(Foo("23", Bar("x", 1))))
    res0: String = 
    {
      "id" : "23",
      "bar" : {
        "x" : "x",
        "y" : 1
      }
    }
    

    당신이 만드는 2.1 재생을 사용하는 경우 또한, 확실히 2.10의 매크로의 브랜드의 새로운 사용을 체크 아웃 : http://www.playframework.com/documentation/2.1.0/ScalaJsonInception

    하여 케이스 클래스의 사용과 함께있을 행복 당신이 만약 발 / 바르 'json으로 출력의 키로서 사용되는 이름, BTW, 당신은이 한 라이너를 사용할 수있는 경우와 같이 :

    implicit val barFormat = Json.writes[Bar]
    implicit val fooFormat = Json.writes[Foo]
    

    그것은 당신에게 정확한 상당을 줄 것이다 :

    scala> import play.api.libs.json._
    import play.api.libs.json._
    
    scala> case class Bar(x: String, y: Int)
    defined class Bar
    
    scala> case class Foo(id: String, bar: Bar)
    defined class Foo
    
    scala> implicit val barWrites = Json.writes[Bar]
    barWrites: play.api.libs.json.OWrites[Bar] = play.api.libs.json.OWrites$$anon$2@257cae95
    
    scala> implicit val fooWrites = Json.writes[Foo]
    fooWrites: play.api.libs.json.OWrites[Foo] = play.api.libs.json.OWrites$$anon$2@48f97e2a
    
    scala> Json.prettyPrint(Json.toJson(Foo("23", Bar("x", 1))))
    res0: String = 
    {
      "id" : "23",
      "bar" : {
        "x" : "x",
        "y" : 1
      }
    }
    
  2. from https://stackoverflow.com/questions/15704756/how-to-implement-implicit-json-writes-of-embedded-object-in-play-framework-2-x by cc-by-sa and MIT license