json4s: невозможно проанализировать JSON с переименованным полем

Мне нужно сериализовать, а затем десериализовать объект класса case с полем "name" из JSON, который имеет поле "animalname" вместо "name". Сериализация работает нормально, а десериализация — нет. Я использовал FieldSerializer с renameTo() и renameFrom():

import org.json4s._
import org.json4s.FieldSerializer._
import org.json4s.jackson.Serialization._

case class WildDog(name: String)
val dogSerializer = FieldSerializer[WildDog](
  renameTo("name", "animalname"),
  renameFrom("animalname", "name"))
implicit val formats = DefaultFormats + dogSerializer
// serialize
val json = write(WildDog("beefy")) // {"animalname":"beefy"}, as expected
// try to deserialize
val dog = parse(json).extract[WildDog] // expected: Dog("beefy")

На самом деле, extract() выдает исключение:

org.json4s.package$MappingException: No usable value for name
Did not find value which can be converted into java.lang.String
    at org.json4s.reflect.package$.fail(ws.sc:94)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(ws.sc:409)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(ws.sc:417)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(ws.sc:417)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(ws.sc:240)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(ws.sc:240)
    at scala.collection.mutable.ResizableArray$class.foreach(ws.sc:55)
    at scala.collection.mutable.ArrayBuffer.foreach(ws.sc:43)
    at scala.collection.TraversableLike$class.map(ws.sc:240)
    at scala.collection.AbstractTraversable.map(ws.sc:101)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$instantiate(ws.sc:417)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(ws.sc:445)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(ws.sc:442)
    at org.json4s.Extraction$.org$json4s$Extraction$$customOrElse(ws.sc:454)
    at org.json4s.Extraction$ClassInstanceBuilder.result(ws.sc:442)
    at org.json4s.Extraction$.extract(ws.sc:304)
    at org.json4s.Extraction$.extract(ws.sc:38)
    at org.json4s.ExtractableJsonAstNode.extract(ws.sc:17)

Как правильно десериализовать этот JSON?

обновление: я использую Scala 2.10, json4s 3.2.5.

обновление 2: я использую эту зависимость Maven для json4s:

<dependency>
    <groupId>org.json4s</groupId>
    <artifactId>json4s-jackson_2.10</artifactId>
    <version>3.2.5</version>
</dependency>

person Evgeny Veretennikov    schedule 17.02.2017    source источник


Ответы (1)


попробуйте val dog = read[WildDog](json) вместо val dog = parse(json).extract[WildDog]

На странице github — https://github.com/json4s/json4s есть и другие хорошие примеры.

Редактировать:

Рабочие версии:
Scala 2.10 && org.json4s.jackson >= 3.5.0
Scala 2.11 && org.json4s.jackson >= 3.2.5

Я не проверял более ранние версии Scala 2.10, но существует исключение, когда я использую 3.2.5.

Кроме того, я могу заставить работать val dog = parse(json).extract[WildDog], но вы должны импортировать JsonMethods -> import org.json4s.jackson.JsonMethods.parse

person pjames    schedule 17.02.2017
comment
Пробовал, такое же MappingException :( - person Evgeny Veretennikov; 17.02.2017
comment
Какую версию scala вы используете? Я могу заставить его работать с 2.11 вместо 2.10. - person pjames; 17.02.2017
comment
Я использую Scala 2.10, json4s 3.2.5. Думаю, у меня сейчас не будет возможности перейти на 2.11... - person Evgeny Veretennikov; 17.02.2017
comment
Похоже, есть поддержка версии 2.10, mvnrepository.com/artifact/org.json4s/ json4s-jackson_2.10. Попробуйте использовать эти зависимости вместо 2.11. - person pjames; 17.02.2017
comment
Попробуйте использовать самые последние библиотеки json4s-jackson_2.10, я использовал 3.5.0, и мне удалось заставить его работать. - person pjames; 18.02.2017