Arrays 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

我需要使用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":""
         }
      }]

可以帮忙吗?

生成的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]