Сериализация и десериализация кейсов с помощью lift-json - PullRequest
8 голосов
/ 18 февраля 2011

Я пытаюсь выполнить базовую сериализацию / гидратацию с помощью lift-json, но безуспешно.Насколько я могу судить из пакета readme, это должно работать.Справка?

Я использую Scala 2.8.0 и Lift 2.2, кросс-построенные для 2.8 с sbt ("net.liftweb" %% "lift-json"% "2.2").

import net.liftweb.json._
import net.liftweb.json.Serialization.{read, write}

implicit val formats = Serialization.formats(NoTypeHints)

case class Route(title: String)

val rt = new Route("x277a1")

val ser = write(rt)
// ser: String = {} ... 

val deser = read[Route]("""{"title":"Some Title"}""")
// net.liftweb.json.MappingException: Parsed JSON values do not match with class constructor

Ответы [ 2 ]

10 голосов
/ 18 февраля 2011

Lift Сериализация JSON не работает для классов дел, определенных в REPL (paranamer не может найти байт-код для чтения метаданных типа).Скомпилируйте Route с помощью scalac, и тогда приведенный выше пример работает.

2 голосов
/ 14 мая 2011

Та же проблема применяется каждый раз, когда (de) сериализуемый класс не находится на пути к классам.В этом случае paranamer не может прочитать имена параметров.Необходимо предоставить пользовательский ParameterNameReader.

Такая проблема относится, например, к:

  • REPL (как уже упоминалось) - если вы не определяете класс вне REPL и добавляете через classpath.
  • Play Framework - если вы не предоставите простой пользовательский ParameterNameReader (см. Ниже) или загрузите (де) сериализованный класс как зависимость Maven / Play / ...
  • Не стесняйтесь добавлять другую ситуацию (Вы можете редактировать этот пост).

PlayParameterNameReader:

import net.liftweb.json.ParameterNameReader
import java.lang.reflect.Constructor
import play.classloading.enhancers.LocalvariablesNamesEnhancer
import scala.collection.JavaConversions._

object PlayParameterReader extends ParameterNameReader{
    def lookupParameterNames(constructor: Constructor[_]) = LocalvariablesNamesEnhancer.lookupParameterNames(constructor)
}
...