首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala Argonaut Json Array/Object

Scala Argonaut Json Array/Object
EN

Stack Overflow用户
提问于 2015-01-16 20:04:24
回答 2查看 1.1K关注 0票数 0

我需要使用scala和argonaut创建这个json对象:

代码语言:javascript
复制
   "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,我将创建以下对象:

代码语言:javascript
复制
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是这样的:

代码语言:javascript
复制
   "name_value_list":[{
          "created_by":{
              "name":"created_by",
              "value":"1"
           },       
           "name":{
              "name":"name",
              "value":"The Name"
           },
           "securitygroup_primary_group":{
               "name":"securitygroup_primary_group",
               "value":""
         }
      }]

能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-18 10:59:34

生成的JSON包含一个Array,但是您需要一个Map。为了找出哪里出错了,您应该研究一下在JSON编码之前创建的Scala类型。

您的代码可以重构为以下代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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" -> "")
)

,最后的答案是

代码语言:javascript
复制
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类自动派生编解码器,如下所示:

代码语言:javascript
复制
import argonaut._
implicit val codec = CodecJson.derive[YourCaseClass]
票数 2
EN

Stack Overflow用户

发布于 2015-01-16 20:25:31

代码语言:javascript
复制
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" ->""))
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27991943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档