我有两个从案例类创建的JsValue,即Book和Book详细信息
val bookJson = Json.tojson(Book)
val bookDetailJson = Json.tojson(BookDetail)
Run Code Online (Sandbox Code Playgroud)
格式为:
//Book
{
id: 1,
name: "A Brief History of Time"
}
//BookDetail
{
bookId: 1,
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
Run Code Online (Sandbox Code Playgroud)
如何将它们合并到play-framework 2.10中的单个Json?即
//Book with detail
{
id: 1,
name: "A Brief History of Time",
bookId: 1,
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试转换,但未能遍历第二个JsValue:
val mapDetail = (__).json.update(
__.read[JsObject].map { o =>
o.deepMerge( JsObject(Seq(("detail", bookDetailJson))) )
})
bookJson.validate(mapDetail).get
Run Code Online (Sandbox Code Playgroud)
它会降低一级,我真的不想要.
//Book with detail
{
id: 1,
name: …
Run Code Online (Sandbox Code Playgroud) 我正在使用Play framework 2.1和Scala 2.10.1,并希望构建一个通用函数来从自定义案例类的List中构造一个JsArray.
private def buildJsArray[T](l: List[T])(result: JsArray): JsArray = {
l match {
case List() => result
case x::xs => buildJsArray(xs)(result :+ Json.toJson(x)) // compiling error here!
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
val applyJsonArray = buildJsArray(List[Apple])(new JsArray())
Run Code Online (Sandbox Code Playgroud)
但是,抛出了编译错误:
Run Code Online (Sandbox Code Playgroud)No Json deserializer found for type T. Try to implement an implicit Writes or Format for this type.
我确实为特定的案例类(即Apple案例类)编写了一个Json反序列化器.
如何推迟编译器在运行时而不是在编译时检查x的类型?
非常感谢!
在Scala中,有很多方法可以创建对象:
例如,使用new关键字创建类
class Car {
def startEngine() = println("run....")
}
val car = new Car
car.startEngine() // run....
Run Code Online (Sandbox Code Playgroud)
其中car对象应该像堆中的Java座位中的"newed"对象一样,并且在被取消引用时等待垃圾收集.
那么,创造特质怎么样?
trait Car {
def startEngine() = println("run...")
}
val car = new Car {}
car.startEngine() //run....
Run Code Online (Sandbox Code Playgroud)
这是一个有效的语法,使用类myCar扩展Car创建对象.相反,它只是从Trait创建对象.
它是否反对堆中的座位?(我猜它不是)那么,它是否存在于堆栈中并且一旦从scoop中被取消引用为局部变量?
最后,如何通过对象?
object Car {
def startEngine() = println("run...")
}
Car.startEngine() //run....
Run Code Online (Sandbox Code Playgroud)
这与via Trait相同吗?我相信对象更有可能生活在堆栈中.
在内存分配方面,有人可以就这三种语法之间的区别进行阐述吗?
我正在尝试使用JavaTokenParser来解析从前一个令牌读取大小的字符串的重复次数,即
list-name:5
ABCDE
second-list-name:2
AB //<--the length of the string determines by the value at the token before
Run Code Online (Sandbox Code Playgroud)
因此,repN将由列表名称后面的令牌I确定
def body = (listname <~ ":") ~ (numOfRepeat <~ LF) ~ repN(?, char)
def char = """[A-Z]""".r
Run Code Online (Sandbox Code Playgroud)
有什么技巧我可以将刚传递的令牌(numOfRepeat)作为Int值传递给下一个解析器(repN)?
谢谢!