#json #haskell #aeson
#json #haskell #aeson
Вопрос:
Кто-нибудь знает, как преобразовать
tt :: (Int, [(Int, String)])
tt = (777, [(1, "AA") , (2, "BB") , (3, "CC")])
в JSON аналогично
{
"user": 777,
"data": [
{ "num": 1 , "typ": "AA" },
{ "num": 2 , "typ": "BB" },
{ "num": 3 , "typ": "CC" }
]
}
используя (желательно) Aeson ?
Комментарии:
1. Да, я знаю. Это не значит, что я собираюсь просто дать вам решение. Что вы пытались сделать?
2. Приведенные ниже документы
ToJSON
будут вам полезны.3. Было бы более идиоматично (консенсус, по-видимому, легче поддерживать / аргументировать) использовать некоторые типы данных, а не вложенные кортежи. Также похоже, что это упростит преобразование в json.
Ответ №1:
Aeson
toJSON
функция должна преобразовываться tt
как есть, но она не даст вам имена полей. Чтобы получить имена, создайте пользовательский тип данных (и, возможно, тип данных, эквивалентный (Int,String), чтобы поместить имена в эти поля) и создайте свой собственный пользовательский экземпляр, ToJSON
как описано в документации.Для того, что вы хотите сделать, вам, вероятно, удастся обойтись простым deriving Generic
объявлением экземпляра ToJSON
.
Редактировать: просто попробовал это, и это работает нормально, но если вам действительно нужно, чтобы это поле данных называлось data, вам придется написать пользовательский toJSON
экземпляр, потому data
что это зарезервированное ключевое слово в Haskell, и вы не можете использовать его как имя для чего-либо.