Arrays Scala Argonaut Json数组/对象
我需要使用scala和argonaut创建这个json对象:Arrays Scala Argonaut Json数组/对象,arrays,json,scala,encode,argonaut,Arrays,Json,Scala,Encode,Argonaut,我需要使用scala和argonaut创建这个json对象: "name_value_list":{ "created_by":{ "name":"created_by", "value":"1" }, "name":{ "name":"name", "value":"The Name" }, "securitygroup_pri
"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":""
}
}]
可以帮忙吗?生成的JSON包含一个数组,但您需要一个映射。为了找出哪里出了问题,应该调查在JSON编码之前创建的Scala类型
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" ->""))
您的代码可以重构为以下内容:
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
)
其中,元组的类型为Tuple3[Map[String,Map[String,String]],Map[String,Map[String,String]],Map[String,Map[String,String]]
Argonaut自然地将元组转换为数组
为了获得所需的JSON,需要将元组更改为映射:
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" -> "")
)
最终答案是:
旁注:您可能会发现使用case类构造数据更容易,然后编写代码对其进行编码。我发现案例类比映射的映射更容易推理
从Argonaut 6.1-M5开始,您可以使用宏从case类自动派生编解码器,如下所示:
import argonaut._
implicit val codec = CodecJson.derive[YourCaseClass]
谢谢这很好,我尝试实现编解码器以便于管理数据。
import argonaut._
implicit val codec = CodecJson.derive[YourCaseClass]