簡體   English   中英

Play Framework 2.1.1 Json編寫嵌套對象

[英]Play Framework 2.1.1 Json Writes nested objects

我整個下午一直試圖讓自己的頭腦無所適從,Play 2.1.1徹底改變了Json如何讀寫作品。

基本上我有一個包裝器對象,看起來像:

case class CombinedUser(user: SocialUser, userdetails: UserDetails)

你可以看到它包含2個我想要序列化和反序列化為json的類。

但我不明白如何使用新設計獲取和設置子類中的字段。

例如

implicit val combinedUser2Reads = (
  (__ \ "email").read[String] and
  (__ \ "providerid").read[String] and
  (__ \ "firstname").read[String] and
  (__ \ "lastname").read[String] and
  (__ \ "fullname").read[String] and
  (__ \ "avatarurl").read[String] and
  (__ \ "address1").read[String] and
  (__ \ "address2").read[String] and
  (__ \ "address3").read[String] and
  (__ \ "city").read[String] and
  (__ \ "country").read[String] and
  (__ \ "phone").read[String] and
  (__ \ "publickey").as[String]
)(CombinedUser2.apply _)

我想要一個包含大多數子類字段的json blob,所有字符串。

因為它使用了apply東西,所以我看不出如何在映射之前創建子類。

非常感謝任何幫助或指導。

謝謝

湯姆

你可以這樣做:

case class SocialUser(firstName: String, lastName: String)
case class UserDetails(avatarUrl: String, phone: String)
case class CombinedUser(user: SocialUser, userDetails: UserDetails)  
implicit val combinedUserReads: Reads[CombinedUser] = (
  (__ \ "user").read((
    (__ \ "firstName").read[String] and
    (__ \ "lastName").read[String]
  )(SocialUser)) and
  (__ \ "userDetails").read((
    (__ \ "avatarUrl").read[String] and
    (__ \ "phone").read[String]
  )(UserDetails))
)(CombinedUser)

但是創建單獨的Reads更好:

implicit val socialUserReads = (
  (__ \ "firstName").read[String] and
  (__ \ "lastName").read[String]
)(SocialUser)    
implicit val userDetailsReads = (
  (__ \ "avatarUrl").read[String] and
  (__ \ "phone").read[String]
)(UserDetails)
implicit val combinedUserReads: Reads[CombinedUser] = (
  (__ \ "user").read[SocialUser] and
  (__ \ "userDetails").read[UserDetails]
)(CombinedUser)

編輯:對於簡單的案例類, 它可以做

implicit val socialUserReads = Json.format[SocialUser]
implicit val userDetailsReads = Json.format[UserDetails]
implicit val combinedUserReads = Json.format[CombinedUser]

以下是對JSON Reads等的全面介紹。

部分物體怎么樣? 如果我不想填寫構造函數中的每個字段,我可以通過清空,還是重載構造函數或類似的?

使用Option

case class CombinedUser(user: SocialUser, userDetails: Option[UserDetails])
//reads
implicit val combinedUserReads: Reads[CombinedUser] = (
  (__ \ "user").read[SocialUser] and
  (__ \ "userDetails").readOpt[UserDetails]
)(CombinedUser)
//writes
implicit val combinedUserWrites: Writes[CombinedUser] = (
  //socialUserWrites and userDetailsWrites must be in scope
  (__ \ "user").write[SocialUser] and
  (__ \ "userDetails").write[Option[UserDetails]]
)(unlift(CombinedUser.unapply))

val json = Json.obj(
  "user" -> Json.obj(
    "firstName" -> "Homer",
    "lastName" -> "Simpson"
  )
)
Json.fromJson[CombinedUser](json)
//JsSuccess(CombinedUser(SocialUser(Homer,Simpson),None),)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM