我需要使用scala和argonaut创建这个json对象:
"name_value_list":{
"created_by":{
"name":"created_by",
"value":"1"
},
"name":{
"name":"name",
"value":"The Name"
},
"securitygroup_primary_group":{
"name":"securitygroup_primary_group",
"value":""
}
}使用scala,我将创建以下对象:
Map("name_value_list" -> (
Map("created_by"-> Map("name" ->"created_by", "value"->"1")),
Map("name"-> Map("name" ->"name", "value"->"X")),
Map("securitygroup_primary_group"-> Map("name" ->"securitygroup_primary_group", "value" ->"")))但是产生的json是这样的:
"name_value_list":[{
"created_by":{
"name":"created_by",
"value":"1"
},
"name":{
"name":"name",
"value":"The Name"
},
"securitygroup_primary_group":{
"name":"securitygroup_primary_group",
"value":""
}
}]能帮忙吗?
发布于 2015-01-18 10:59:34
生成的JSON包含一个Array,但是您需要一个Map。为了找出哪里出错了,您应该研究一下在JSON编码之前创建的Scala类型。
您的代码可以重构为以下代码:
val tuple = (
Map("created_by" -> Map("name" -> "created_by", "value" -> "1")),
Map("name" -> Map("name" -> "name", "value" -> "X")),
Map("securitygroup_primary_group" -> Map("name" -> "securitygroup_primary_group", "value" -> ""))
)
val toEncode = Map(
"name_value_list" -> tuple
)其中tuple的类型为Tuple3[Map[String, Map[String, String]], Map[String, Map[String, String]], Map[String, Map[String, String]]]。
Argonaut自然地将元组转换为数组。
为了获得所需的JSON,需要将元组更改为Map:
val notATuple = Map(
"created_by" -> Map("name" -> "created_by", "value" -> "1"),
"name" -> Map("name" -> "name", "value" -> "X"),
"securitygroup_primary_group" -> Map("name" -> "securitygroup_primary_group", "value" -> "")
),最后的答案是
val toEncode = Map(
"name_value_list" -> Map(
"created_by" -> Map("name" -> "created_by", "value" -> "1"),
"name" -> Map("name" -> "name", "value" -> "X"),
"securitygroup_primary_group" -> Map("name" -> "securitygroup_primary_group", "value" -> "")
)
)附带注意:您可能会发现用case类构造数据更容易,然后编写编解码器来对它们进行编码。我发现案例类比地图地图更容易推理。
在Argonaut 6.1-M5中,您可以使用宏从case类自动派生编解码器,如下所示:
import argonaut._
implicit val codec = CodecJson.derive[YourCaseClass]发布于 2015-01-16 20:25:31
Map("name_value_list" -> (
Map("created_by"-> Map("name" ->"created_by", "value"->"1"),
"name"-> Map("name" ->"name", "value"->"X"),
"securitygroup_primary_group"-> Map("name" ->"securitygroup_primary_group", "value" ->""))https://stackoverflow.com/questions/27991943
复制相似问题