Scala-生成Json时无法删除键->值“{}”大括号的双引号

y3bcpkx1  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(112)

Scala-生成Json时无法删除“{}”大括号的双引号

import scala.util.Random
import math.Ordered.orderingToOrdered
import math.Ordering.Implicits.infixOrderingOps
import play.api.libs.json._
import play.api.libs.json.Writes
import play.api.libs.json.Json.JsValueWrapper

val data1 = (1 to 2)
.map {r => Json.toJson(Map(
                "name" -> Json.toJson(s"Perftest${Random.alphanumeric.take(6).mkString}"),
                "domainId"->Json.toJson("343RDFDGF4RGGFG"),
                "value" ->Json.toJson("{}")))}
val data2 = Json.toJson(data1)
println(data2)

结果:[{“name”:“PerfestpXI1ID”,“domainID”:“343RDFDGF4RGGFG”,“value”:“{}”},{“name”:“PerfestHoZSQR”,“domainID”:“343RDFDGF4RGGFG”,“value”:“{}”}]
预期:“值”:{}

[{“name”:“PerfestpXI1ID”,“domainID”:“343RDFDGF4RGGFG”,“Value”:{}},{“name”:“PerfestHoZSQR”,“domainID”:“343RDFDGF4RGGFG”,“Value”:{}}]
请建议一个解决方案

oymdgrw7

oymdgrw71#

您给它一个String,所以它在JSON中创建一个字符串。您实际需要的是一个空词典,它是Scala中的Map

val data1 = (1 to 2)
  .map {r => Json.toJson(Map(
                  "name" -> Json.toJson(s"Perftest${Random.alphanumeric.take(6).mkString}"),
                  "domainId"->Json.toJson("343RDFDGF4RGGFG"),
                  "value" ->Json.toJson(Map.empty[String, String])))}

通常,您应该为数据创建一个case class,并为该类创建一个定制的Writes实现,这样就不必对每个值调用Json.toJson
下面是如何仅使用单个Json.toJson调用进行转换:

import play.api.libs.json.Json

case class MyData(name: String, domainId: String, value: Map[String,String])
implicit val fmt = Json.format[MyData]

val data1 = (1 to 2)
  .map { r => new MyData(
      s"Perftest${Random.alphanumeric.take(6).mkString}",
      "343RDFDGF4RGGFG",
      Map.empty
    )
  }
val data2 = Json.toJson(data1)
println(data2)

value字段可以是标准类型,例如BooleanDouble。它也可以是另一个创建嵌套JSON的case class,只要有一个类似的Json.format行用于新类型。
更复杂的JSON可以通过使用文档中描述的自定义Writes(和Reads)实现来生成。

相关问题