2015-01-16 3 views
0

Мне нужно создать этот объект JSON с помощью Скала и Аргонавт:Scala Аргонавт Json Array/Object

"name_value_list":{ 
     "created_by":{ 
      "name":"created_by", 
      "value":"1" 
     },  
     "name":{ 
      "name":"name", 
      "value":"The Name" 
     }, 
     "securitygroup_primary_group":{ 
      "name":"securitygroup_primary_group", 
      "value":"" 
    } 
    } 

с Скале я создать этот объект:

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":"" 
     } 
     }] 

Может помочь, пожалуйста?

ответ

1

Сгенерированный JSON содержит Array, но вместо этого вы хотите использовать карту. Чтобы узнать, где вы поступили не так, вам следует изучить типы Scala, которые вы создали до кодирования JSON.

Ваш код может быть переработан на следующее:

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 вы хотите, вы должны изменить Кортеж в карте:

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, а затем написать Codecs для их кодирования. Я нахожу классы классов легче рассуждать, чем Карты карт карт.

По Аргонавт 6.1-M5, вы можете использовать макросы, чтобы автоматически получить кодеки из тематических классов, например, так:

import argonaut._ 
implicit val codec = CodecJson.derive[YourCaseClass] 
+0

Спасибо! это прекрасно работает, я пытаюсь реализовать кодеки для упрощения управления данными. –

-2
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" ->"")) 
Смежные вопросы