首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aeson编码嵌套记录

Aeson编码嵌套记录
EN

Stack Overflow用户
提问于 2020-02-07 22:38:27
回答 1查看 107关注 0票数 1

假设有这样的记录:

代码语言:javascript
复制
data Place = Place
  { details :: PlaceDetails
  , amenities :: [Amenity]
  , photos :: [PlacePhoto]
  } deriving (Generic)

现在,它是这样的:

代码语言:javascript
复制
instance ToJSON Place where
  toEncoding Place{..} = 
    pairs  $ "details" .= details
          <> "amenities" .= amenities
          <> "photos" .= photos

我使用toEncoding来保存我想要的特定顺序。但是,我想从编码中删除details键,以便PlaceDetails中所有字段与amenitiesphotos处于同一级别,而无需手动指定所有这些字段,因为PlaceDetails非常大。我该怎么做呢?我知道我可以用HML.unions合并[Value],但我只用toJSON做了这件事,而不是toEncoding

我目前所拥有的:

代码语言:javascript
复制
{
    "details": {
        "id": "place_6de6cda0f8524a6f9c264c84afdbadad",
        "name":"somename",
        "description":"some description", 
        "other": "a lot more fields"
    }
    "amenities": []
    "photos": []
}

这就是我想要的:

代码语言:javascript
复制
{
    "id":"place_6de6cda0f8524a6f9c264c84afdbadad",
    "name":"somename",
    "description":"some description", 
    "other": "a lot more fields",
    "amenities": []
    "photos": []
}

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-02-08 01:07:02

一个Aeson对象只是一个哈希图,你可以使用<> (中缀)或mappend将其联合起来。

例如:

代码语言:javascript
复制
#!/usr/bin/env cabal
{- cabal:
    build-depends: base, aeson
-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLists   #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE RecordWildCards   #-}

module Main where

import Data.Aeson
import GHC.Generics

main :: IO ()
main = print (encode (Place (Foo 1 2) (Bar 3 4)))

data Foo = Foo {foo1 :: Int, foo2 :: Int}
    deriving (Eq,Ord,Show,Generic,ToJSON)

data Bar = Bar {bar1 :: Int, bar2 :: Int}
    deriving (Eq,Ord,Show,Generic,ToJSON)

data Place = Place { foo :: Foo , bar :: Bar }
    deriving (Eq,Ord,Show,Generic)

instance ToJSON Place where
  toJSON Place{..} =
       let Object b = toJSON bar
       in Object ([("foo",toJSON foo)] <> b)

我们可以运行下面的代码:

代码语言:javascript
复制
% chmod +x so.hs && ./so.hs
... snippet out build info ...
"{\"bar1\":3,\"foo\":{\"foo2\":2,\"foo1\":1},\"bar2\":4}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60115551

复制
相关文章

相似问题

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