Десериализовать список кортежей scala со значениями параметров с помощью json4s

Я не знаю, как использовать json4s для сериализации списка кортежей, имеющих значения параметров, чтобы он мог снова десериализовать его. В следующем примере показан тип для (де) сериализации:

import org.json4s.jackson.Serialization.{read, write}
implicit val formats = DefaultFormats

case class ListTupleOptionValue(l: List[(String, Option[String])])

// Everything is fine having a defined value
val withSomeValueJson = write(ListTupleOptionValue(List(("bKey", Some("bValue")))))
read[ListTupleOptionValue](withSomeValueJson)

// Serialization is faulty or at least deserialization cannot handle it
val withNoneValue = ListTupleOptionValue(List(("bKey", None)))
val withNoneValueJson = write(withNoneValue)// {"l":[{}]} notice the {} empty object definition in the list []

// this works when not having the {} empty object definition
read[ListTupleOptionValue]("{\"l\":[]}")

// this fails with "No usable value for l"
read[ListTupleOptionValue](withNoneValueJson)

И выход при попытке

No usable value for l
Expected object with 1 element but got JObject(List())
org.json4s.package$MappingException: No usable value for l
Expected object with 1 element but got JObject(List())
at org.json4s.reflect.package$.fail(package.scala:95)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(Extraction.scala:521)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$14.apply(Extraction.scala:541)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$14.apply(Extraction.scala:541)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.json4s.Extraction$ClassInstanceBuilder.instantiate(Extraction.scala:529)
at org.json4s.Extraction$ClassInstanceBuilder.result(Extraction.scala:592)
at org.json4s.Extraction$.extract(Extraction.scala:387)
at org.json4s.Extraction$.extract(Extraction.scala:39)
at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)
at org.json4s.jackson.Serialization$.read(Serialization.scala:50)
at org.json4s.Serialization$class.read(Serialization.scala:30)
at org.json4s.jackson.Serialization$.read(Serialization.scala:17)

Есть предложения о том, как заставить этот пример кода работать? Заранее спасибо.

С уважением, Трим


person user2134911    schedule 30.06.2017    source источник
comment
Да, я просто тестировал то же самое, что вы редактировали. Если вы предоставите null вместо None, он, кажется, сериализует его, но выдает исключение при десериализации.   -  person philantrovert    schedule 30.06.2017
comment
Извините за редактирование. Я бы предпочел не использовать null, поэтому я ввел опцию.   -  person user2134911    schedule 30.06.2017
comment
эй, это не проблема. Можете ли вы проверить эту ссылку и посмотреть, оно работает. Есть некоторые ограничения по версии, поэтому я не могу протестировать.   -  person philantrovert    schedule 30.06.2017
comment
Отлично, это решает мою проблему. Когда я изменяю значение неявных форматов, десериализация может восстановить мой объект. Таким образом, код примера становится implicit val formats = DefaultFormats.preservingEmptyValues println(write(withNoneValue)) // prints {"l":[{"bKey":null}]}   -  person user2134911    schedule 30.06.2017
comment
Хорошо знать. Отправьте его как ответ с версией json4s и соответствующим кодом, чтобы на него позже мог ссылаться кто-то, у кого есть аналогичный вопрос.   -  person philantrovert    schedule 30.06.2017