我在使用Jerkson处理
Scala中的
JSON时遇到了这个优秀的
tutorial.特别是,我有兴趣将JSON反序列化为用户定义的case类.这篇文章有一个简单的例子
- case class Simple(val foo: String,val bar: List[String],val baz: Map[String,Int])
- object SimpleExample {
- def main(args: Array[String]) {
- import com.codahale.jerkson.Json._
- val simpleJson = """{"foo":42,"bar":["a","b","c"],"baz":{"x":1,"y":2}}"""
- val simpleObject = parse[Simple](simpleJson)
- println(simpleObject)
- }
- }
运行它时出现此错误,我在Play 2.0.1,Scala 2.9.1-1,Jerkson 0.5.0.
- Execution exception [[ParsingException: Unable to find a case accessor
在Google网上论坛中也找到了this,但没有帮助.
有任何想法吗?
解决方法
不幸的是我不知道Jerkson,但Spray-Json让这类东西变得简单.以下示例来自
Spray-Json readme:
- case class Color(name: String,red: Int,green: Int,blue: Int)
- object MyJsonProtocol extends DefaultJsonProtocol {
- implicit val colorFormat = jsonFormat4(Color)
- }
- import MyJsonProtocol._
- val json = Color("CadetBlue",95,158,160).toJson
- val color = json.convertTo[Color]
这是与someone’s git repository略有不同的例子:
- package cc.spray.json.example
- import cc.spray.json._
- object EnumSex extends Enumeration {
- type Sex = Value
- val MALE = Value("MALE")
- val FEMALE = Value("FEMALE")
- }
- case class Address(no: String,street: String,city: String)
- case class Person(name: String,age: Int,sex: EnumSex.Sex,address: Address)
- object SprayJsonExamples {
- def main(args: Array[String]) {
- val json = """{ "no": "A1","street" : "Main Street","city" : "Colombo" }"""
- val address = JsonParser(json).fromJson[Address]
- println(address)
- val json2 = """{ "name" : "John","age" : 26,"sex" : 0,"address" : { "no": "A1","city" : "Colombo" }}"""
- val person = JsonParser(json2).fromJson[Person]
- println(person)
- }
- }