json - 如何设置类中属性的值并使用 lift json 将其转换为 json

标签 json scala scala-2.11 lift-json

我有一个名为 Child 的类,我想使用 Lift Json 将其转换为 JSON。一切工作正常,但问题是我通过 Scala setter 设置属性的值,但这个新值未存储在 Json 中。

这是代码:

case class Child1(var str:String, var Num:Int, MyList:List[Int], myDate:DateTime){
  var number:Int=555
}
val c = Child1("Mary", 5, List(1, 2), DateTime.now())
c.number = 1
println("number" + c.number)
val ser = write(c)
println("Child class converted to string" + ser) 

var obj = read[Child1](ser)
println("object of Child is "+  obj)
println("str" + obj.str)
println("Num" + obj.Num)
println("MyList" + obj.MyList)
println("myDate" + obj.myDate)
println("number" + obj.number)

控制台上打印的输出是:

number1
Child class converted to string{"str":"Mary","Num":5,"MyList":[1,2],"myDate":{}}
object of Child is Child1(Mary,5,List(1, 2),2015-07-24T14:04:09.266+05:00)
strMary
Num5
MyListList(1, 2)
myDate2015-07-24T14:04:09.266+05:00
number 555

为什么obj.number显示值555?它应该打印 1

最佳答案

假设DateTime是Joda DateTime,则需要定义一个自定义的json序列化器来序列化DateTime对象

请参阅“序列化不支持的类型”部分here

序列化器看起来像这样。

import org.joda.time.DateTime
import net.liftweb.json.Serialization.{ read, write }
import net.liftweb.json.DefaultFormats
import net.liftweb.json.Serializer
import net.liftweb.json.JsonAST._
import net.liftweb.json.Formats
import net.liftweb.json.TypeInfo
import net.liftweb.json.MappingException
import net.liftweb.json.FieldSerializer


class JodaDateTimeSerializer extends Serializer[DateTime] {
  private val JodaDateTimeClass = classOf[DateTime]

  def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), DateTime] = {
    case (TypeInfo(JodaDateTimeClass, _), json) => json match {
      case JInt(timemillis) => new DateTime(timemillis.longValue)
      case x => throw new MappingException("Can't convert " + x + " to DateTime")
    }
  }

  def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
    case x: DateTime => JInt(BigInt(x.getMillis))
  }
}

还可以像这样定义您的格式

 implicit val formats = DefaultFormats + new JodaDateTimeSerializer + new FieldSerializer[Child1]

请注意使用FieldSerializer来序列化非构造函数字段,数字

关于json - 如何设置类中属性的值并使用 lift json 将其转换为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31606545/

相关文章:

scala - 与 acceptWithActor[String, JsValue] 等效的 Play 2.5.x 是什么?

scala - 这可能是 Scala 编译器错误吗?

Scala 版本未更新

scala - 使用Scala 2.11在独立模式下运行Spark?

javascript - 将项目从 JSON 对象推送到 Angular js 中的下拉列表

ios - JSON 解析返回 null

scala - 如何使一个参数默认为 Scala 中另一个参数的值?

scala - 进行相等测试时 Scala 选项的惯用语

javascript - 如何在通过 AJAX 检索数据后循环每个 JSON 值

ios - Swift JSONSerialization 作为 NSDictionary 无法获取内部的值