2013-08-08 35 views
7

Tôi có một mã mẫu như sau.Scala Play Json Reads

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 
import play.api.data.validation.ValidationError 
import play.api.libs.json.Reads._ 

case class Retailer(firstName:String,lastName:String,email:String,mobileNo:String,password:String) 
case class Business(name:String,preferredUrl:String,businessPhone:String,retailer:Retailer) 

object JsonTest { 
    val jsonValue = """ 
    { 
    "business": 
    { 
     "name":"Some Business Name", 
     "preferredUrl":"someurl", 
     "businessPhone":"somenumber", 
     "retailer": 
     { 
     "firstName":"Some", 
     "lastName":"One", 
     "email":"[email protected]", 
     "mobileNo":"someothernumber", 
     "password":"$^^HFKH*" 
     } 
    } 

    } 
    """ 
    def printJson ={ 

    implicit val rltRds = (
     (__ \ "firstName").read[String] ~ 
     (__ \ "lastName").read[String] ~ 
     (__ \ "email").read[String] ~ 
     (__ \ "mobileNo").read[String] ~ 
     (__ \ "password").read[String] 
    )(Retailer)  

    implicit val bsnsRds = (
     (__ \ "name").read[String] ~ 
     (__ \ "preferredUrl").read[String] ~ 
     (__ \ "businessPhone").read[String] ~ 
     (__ \ "retailer").read[Retailer](rltRds) 
    )(Business)  


    val buisness = Json.parse(jsonValue).validate[Business](bsnsRds) 
    val bus = new Business("Some Business","somebusinessurl","somenumber", new Retailer("Some","One","[email protected]","someothernumber","$^^HFKH*")) 
    //val json = Json.toJson(bus) 

    println(buisness) 
    } 




    def main(args: Array[String]): Unit = { 
    printJson 
    } 

} 

Tôi nhận được lỗi xác thực Json khi tôi cố phân tích cú pháp thành đối tượng Scala (Business Class trong trường hợp này). Lỗi này là

Tuy nhiên nếu json của tôi là như

val jsonValue = """ 
    { 
     "name":"Some Business Name", 
     "preferredUrl":"someurl", 
     "businessPhone":"somenumber", 
     "retailer": 
     { 
     "firstName":"Some", 
     "lastName":"One", 
     "email":"[email protected]", 
     "mobileNo":"someothernumber", 
     "password":"$^^HFKH*" 
     } 
    } 
    """ 

Lưu ý rằng khung bên ngoài "{" và "kinh doanh:" chìa khóa được loại bỏ. Tôi nhận được JsSuccess. Làm thế nào để viết những lần đọc cho Json như trong trường hợp đầu tiên? Ngoài ra, làm thế nào tôi có thể làm điều đó một cách chung chung?

Vui lòng trợ giúp.

Trả lời

7

Chỉ cần thêm phím business trong đường dẫn:

implicit val bsnsRds = (
     (__ \ "business" \ "name").read[String] ~ 
     (__ \ "business" \ "preferredUrl").read[String] ~ 
     (__ \ "business" \ "businessPhone").read[String] ~ 
     (__ \ "business" \ "retailer").read[Retailer](rltRds) 
    )(Business) 
+0

đó làm việc. Cảm ơn nico_ekito. – user809564

+0

Ok, nhưng có cách nào dễ dàng để chuyển từ biểu mẫu đầu tiên sang biểu mẫu khác để sử dụng ngầm businessReads val = Json.reads [Business] không? – Simon

+0

Rất tiếc, tôi đã tìm thấy giải pháp, bạn có thể làm jsonValue \ "business" – Simon

1

biến thể nhẹ đến ở trên:

implicit val bsnsRds = ({ 
    val business = (__ \ "business") 
    (business \ "name").read[String] ~ 
    (business \ "preferredUrl").read[String] ~ 
    (business \ "businessPhone").read[String] ~ 
    (business \ "retailer").read[Retailer](rltRds) 
})(Business) 
Các vấn đề liên quan