例如,在 Play Json 中,您可以使用此宏Jsonx.formatInline,它將 json 物件行內到其 json 屬性。有沒有什么方法可以使用 jsoniter 庫來實作這一點?例如,在這段代碼中:
case class Foo(values : String)
case class WrapperOfFoo(val : rapperOfFoo)
val codec : JsonValueCodec[[WrapperOfFoo]] = JsonCodecMaker.make
val messageFoo = new Foo("test")
val message = new WrapperOfFoo(messageFoo)
val json = writeToArray(message)(codec).map(_.toChar).mkString
println(json)
結果是:
{
"val": {
"values": "test"
}
}
期望的輸出:
{
"val" : "test"
}
由于它只是一個只有一個屬性的包裝器,我希望它被行內,有沒有辦法在 JsonIter 中實作這一點?
uj5u.com熱心網友回復:
作為對我的評論(關于隱式類)的補充,這就是我的意思:
implicit class CodecOps[A](codec: JsonValueCodec[A]) {
def encodeBy[B](mapFunc: A => B)(implicit bCodec: JsonValueCodec[B]): JsonValueCodec[A] =
new JsonValueCodec[A] {
override def decodeValue(in: JsonReader, default: A): A = codec.decodeValue(in, default)
override def encodeValue(x: A, out: JsonWriter): Unit =
bCodec.encodeValue(mapFunc(x), out)
override def nullValue: A = codec.nullValue
}
def decodedBy[B](contraMapFunc: B => A)(implicit bCodec: JsonValueCodec[B]): JsonValueCodec[A] =
new JsonValueCodec[A] {
override def decodeValue(in: JsonReader, default: A): A =
contraMapFunc(bCodec.decodeValue(in, bCodec.nullValue))
override def encodeValue(x: A, out: JsonWriter): Unit = codec.encodeValue(x, out)
override def nullValue: A = codec.nullValue
}
}
// And then inside your models, assuming implicit JsonValueCodec[Foo] is defined earlier
implicit val codec : JsonValueCodec[FooWrapper] = JsonCodecMaker.make[FooWrapper]
.encodeBy(_.foo)
.decodedBy(FooWrapper.apply)
println(json)
// result => {"values":"test"}
println(readFromString[FooWrapper]("{\"values\":\"test\"}"))
// result => FooWrapper(Foo(test))
請注意,這與 中的行為相同Jsonx.formatInline,因此它不會回傳{"value": "test"}。想象一下,如果Foo是一個復雜的結構會發生什么?應該用什么鍵value替換?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/483488.html
上一篇:tkinter畫布上的鉛筆畫
