2015-07-24 4 views
2

У меня есть класс с именем Child, который я хочу преобразовать в JSON с помощью Lift Json. Все работает нормально, но проблема в том, что я устанавливаю значение атрибута через установщик Scala, но это новое значение не сохраняется в Json.Как установить значение атрибута в классе и преобразовать его в json с помощью лифта 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
Детский класс преобразуется в строку { "ул": "Мария", "Num" : 5, «MyList»: [1,2], «myDate»: {}}
объект 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
номер 555

Почему obj.number отображаются значения 555? Он должен напечатать 1.

ответ

2

Предполагая, что 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 сериализовать не-конструктор подал, номер

Смежные вопросы