7
import net.liftweb.json._
import net.liftweb.json.JsonParser._

object test02 extends App {
    implicit val formats = DefaultFormats
    case class User(
        id: Int = 0,
        name: String = "John Doe",
        gender: String = "M")

    val s1=""" {"id":1,"name":"Bill","gender":"M"} """
    var r1=Serialization.read[User](s1)
    println(r1)

    val s2=""" {"id":1} """
    var r2=Serialization.read[User](s2)
    println(r2)  

}

2 番目の Serialization.read により例外が発生します: net.liftweb.json.MappingException: 名前に使用できる値がありません。

データフォームjsonをケースクラスに読み込むにはどうすればよいですか?ただし、一部のフィールドが欠落している場合、それらはケースクラスのデフォルト値に置き換えられますか?

4

4 に答える 4

6

これについてはかなり前からチケットが公開されているようです: https://www.assembla.com/spaces/liftweb/tickets/534

それまでの間、1 つのオプションは次を使用することOptionです。

    case class User(
        id: Int = 0,
        name: Option[String],
        gender: Option[String]) {
      def defaults = copy(
        name   = name   orElse Some("John Doe"),
        gender = gender orElse Some("M"))
    }
    // ...        
    val s2=""" {"id":1} """
    var r2=Serialization.read[User](s2)
    println(r2)  

それはあなたに与えるはずです:

 User(1,None,None)

そして、次のようなものを使用してデフォルト値を入力できます。

 val r2 = Serialization.read[User](s2).defaults

 // r2: User = User(1,Some(John Doe),Some(M))

もう 1 つのオプションは、ケース クラスに追加のコンストラクターを使用することです。

 case class User(id: Int, name: String, gender: String)
 object User {
   def apply(id:Int): User = User(id, "John Doe", "M")
 }
于 2013-04-10T02:22:30.953 に答える
5

play json ライブラリでそれを行う方法ですが、値のデフォルトとしてだけでなく、パーサーでデフォルトを提供する必要があります。

case class User(id: Int, name: String, gender: String)

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

implicit val userReads: Reads[User] = (
  (__ \ "id").read[Int] and
  (__ \ "name").read[String].or(Reads.pure("John Doe")) and
  (__ \ "gender").read[String].or(Reads.pure("Male"))
)(User)

Json.fromJson[User](Json.parse("""{"id":1,"name":"Bill","gender":"M"}"""))

Json.fromJson[User](Json.parse("""{"id":1}"""))

Reads.pureユーザーのテンプレートインスタンスを作成し、そこに文字列をハードコーディングする代わりに、各フィールドからデフォルトを渡すことにより、デフォルトパラメータからデフォルトを提供できると思います。

于 2014-07-03T08:41:10.650 に答える
0

ほとんどの scala JSON ライブラリは、これで窒息します。

マクロを使用して不足しているフィールドに適切なデフォルトを提供する社内の JSON ライブラリを使用します。(また、Null を none として、Undefined をデフォルトとして区別します。したがって、必要に応じて、デフォルトが Some のオプションを使用できます)

すぐにオープンソース化することを望んでいます。

編集:基本的に、これを行う他の人を知りません。しかし、それは絶えず変化するエコシステムであり、他の誰かがまだそれに取り組んでいるかどうかを知りたい

于 2014-07-02T22:25:36.637 に答える