2017-10-04 55 views
1

我想创建一个JSON对象与瑟茜其中的值可以是字符串或列表,如:创建从瑟茜JSON对象,其中值可以是字符串或列表

val param = Map[String, Map[String, Object]](
    "param_a" -> Map[String, Object](
     "param_a1" -> "str_value", 
     "param_a2" -> List(
     Map[String, String](
      "param_a2.1" -> "value_2.1", 
      "param_a2.2" -> "value_2.2") 
    ) 
    ), 

然而,然后如果我做

param.asJson 

它失败,

​​

回答

0

你只需要在SCOP提供的Encoder隐式实例e代表Object。试试这个:

implicit val objEncoder: Encoder[Object] = Encoder.instance { 
    case x: String => x.asJson 
    case xs: List[Map[String, String]] => xs.asJson 
} 

不过,我会尽量避免使用Object,而是提供了一个ADT来包装两种可能的情况下,这是StringList[Map[String, String]],但是这取决于你。此外,在斯卡拉世界,Object更广泛地被称为AnyRef所以如果你只是想使用Object我建议你把它叫做AnyRef

P.S .:如果您使用Scala版本> = 2.12.0,则可以避免输入Encoder.instance,这要归功于SAM conversion in overloading resolution。因此,代码将成为:

implicit val objEncoder: Encoder[Object] = { 
    case x: String => x.asJson 
    case xs: List[Map[String, String]] => xs.asJson 
} 
+0

谢谢,这个API的新用户,并得到几个简单的问题 – carfield

+0

没问题,你很受欢迎。 – lambdista

1

好,快速的解决方法是使用地图[字符串,JSON]

val param = Map[String, Map[String, Json]](
"param_a" -> Map[String, Json](
    "param_a1" -> "str_value".asJson, 
    "param_a2" -> List(
    Map[String, String](
     "param_a2.1" -> "value_2.1", 
     "param_a2.2" -> "value_2.2") 
).asJson 
), 
+0

这帮助我弄清楚如何用circe做JSON“手动”。 – akauppi

+0

很高兴听到这一点 – carfield