Bir vaka sınıfının önünü açmak için bir turşu ile başlayacakmış gibi görünüyorsunuz. Ancak JSON dizgisi, başlangıç turülü almak için JSONPickle sınıfına beslenebilir. Burada
their array-json test
package so
import scala.pickling._
import json._
case class C(arr: Array[Int]) { override def toString = s"""C(${arr.mkString("[", ",", "]")})""" }
object PickleTester extends App {
val json = """{"arr":[ 1, 2, 3 ]}"""
val cPickle = JSONPickle(json)
val unpickledC: C = cPickle.unpickle[C]
println(s"$unpickledC, arr.sum = ${unpickledC.arr.sum}")
}
göre bir örnek baskılı çıktısı:
C([1,2,3]), arr.sum = 6
I girişi .stripMargin.trim
yanı sıra testi içinde "TPE" drop başardı Testten JSON. Hepsi bir satırda çalışıyor, ama daha açık olabileceğini düşündüm. Testten gelen "tpe" nin gelen JSON için tip güvenlik önlemi alması gerekiyorsa bana açık değil.
Kendinizi yuvarlamak istemedikçe, dekapaj için destekledikleri diğer tek sınıf bir BinaryPickle gibi görünüyor. Bu cevapta kodu derlemek için en son scala-pickling snapshot jar requires quasiquotes.
Ben someting daha karmaşık bu sabah çalıştı ve "tpe" Gelen JSON olmayan primatives için gerekli olduğunu keşfetti - (I karışık hangi tefrika dize gerçekten Pickler uyumlu olması gerektiğini işaret) yukarıdaki koda: naturually, bir istisna atma dan unpickling önlemek için jJson
giriş değerini nasıl oluşturulacağını anlamaya bir J(None, Some("donut"), Some(47))
üzerine .value
kullanmak zorunda
case class J(a: Option[Boolean], b: Option[String], c: Option[Int]) { override def toString = s"J($a, $b, $c)" }
...
val jJson = """{"a": {"tpe": "scala.None.type"},
| "b":{"tpe": "scala.Some[java.lang.String]","x":"donut"},
| "c":{"tpe": "scala.Some[scala.Int]","x":47}}"""
val jPickle = JSONPickle(jJson.stripMargin.trim)
val unpickledJ: J = jPickle.unpickle[J]
println(s"$unpickledJ")
...
.
J
için çıkış gibidir:
J(None, Some(donut), Some(47))
this test bakıldığında görünen gelen JSON tüm primatives veya vaka sınıfları (veya kombinasyonları) JSONPickle sihirli eserler olduğunu, ancak bazı diğer sınıflar gibi ise Seçeneklerin doğru şekilde kaldırılması için ekstra "tpe" tipi bilgiler gereklidir.
dışarı kontrol ettiniz [testler] (https://github.com/scala/pickling/tree/2.10.x/core/src/test/scala/pickling): İşte bir örnek? Görünüşe göre daha fazla örnek var burada [https://speakerdeck.com/heathermiller/on-pickles-and-spores-improving-support-for-distributed-programming-in-scala). – n0741337
Evet, bu sınamaları kontrol ettim, ancak tam olarak aynı davranışı sergiliyorlar: dize veya bayt dizisini çıkarmazlar, ancak bir turşu kaldırırlar. Elimdeki tek şey json dize ve nesne tipi olduğunda, gerçek dünyadaki turşu nereden geliyor? –