Как написать собственный сборщик для класса дел с членом List?
Я пытаюсь написать собственный сборщик для класса дел, который имеет член List[String]. Я в настоящее время использую скала травления версии 0.10.1
Я знаю о builder.beginCollection
метод для засолки коллекций, но я не смог получить какую-либо документацию о его использовании для расчесывания. После большого прочтения исходного кода scala-pickler я нашел некоторые указания о том, как правильно его использовать.
Прямо сейчас у меня есть следующий код, который генерирует, я думаю, неправильный вывод (об этом после примера). Буду признателен за пример кода или за ссылку на документацию.
import scala.pickling._, json._, Defaults._
case class Beta(isSecond : Boolean, notSecond : List[String])
object BetaPickler extends Pickler[Beta] {
override val tag = FastTypeTag[Beta]
override def pickle(picklee: Beta, builder: PBuilder): Unit = {
builder.hintTag(tag) // This is always required
builder.pinHints()
builder.beginEntry(picklee)
builder.putField("isSecond", {
b => b.hintTag(FastTypeTag.Boolean).beginEntry(picklee.isSecond).endEntry()
})
builder.putField("notSecond", { b => {
b.hintTag(FastTypeTag[String])
b.beginEntry()
b.beginCollection(picklee.notSecond.size)
picklee.notSecond.foreach((item: String) => {
b.putElement(pb => {
pb.hintTag(implicitly[FastTypeTag[String]])
stringPickler.pickle(item, pb)
})
})
builder.endCollection()
builder.endEntry()
}
})
builder.unpinHints()
builder.endEntry()
}
}
implicit def pickler: scala.pickling.Pickler[Beta] = BetaPickler
val xBeta : Beta = Beta(true, List("one","three","four"))
Итак, это пример кода, который вы можете скопировать: вставьте его в REPL, он должен работать. Проблема в выходном JSON, где notSecond
член класса Beta
не отображается должным образом. Как вы можете видеть, у объекта notSecond есть пустой член "value", а фактический массив "elem" находится снаружи, сразу после объекта "notSecond", хотя я ожидаю, что он будет внутри, вместо этого элемента "value",
scala> xBeta.pickle
res0: scala.pickling.json.pickleFormat.PickleType =
JSONPickle({
"$type": "Beta",
"isSecond": {
"$type": "scala.Boolean",
"value": true
},
"notSecond": {
"$type": "java.lang.String",
"value": "()"
},
"elems": [
{
"$type": "java.lang.String",
"value": "one"
},
{
"$type": "java.lang.String",
"value": "three"
},
{
"$type": "java.lang.String",
"value": "four"
}
]
})
Я был бы признателен за некоторые комментарии о том, как я выбираю коллекцию List, и, возможно, исправление для моего примера. Большое спасибо!