haskell - 使用包含保留关键字的字段名解析 JSON

标签 haskell aeson

我正在尝试用 aeson 解析以下 JSON。

{
    "data": [
        {
            "id": "34",
            "type": "link",
            "story": "foo"
        },
        {
            "id": "35",
            "type": "link",
            "story": "bar"
        }
    ]
}

由于有很多我想忽略的字段,因此似乎 I should use GHC generics .但是如何编写使用 Haskell 关键字的数据类型定义,如 datatype ?以下当然给出:parse error on input `data'
data Feed = Feed {data :: [Post]}
    deriving (Show, Generic)

data Post = Post {
        id :: String,
        type :: String,
        story :: String
    }
    deriving (Show, Generic)

最佳答案

你可以自己写FromJSONToJSON不依赖 GHC.Generics 的实例。这也意味着您可以为数据表示和 JSON 表示使用不同的字段名称。

Post 的示例实例:

{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Aeson
import qualified Data.ByteString.Lazy as LBS

data Post = Post {
        postId :: String,
        typ :: String,
        story :: String
  }
  deriving (Show)

instance FromJSON Post where
  parseJSON (Object x) = Post <$> x .: "id" <*> x.: "type" <*> x .: "story"
  parseJSON _ = fail "Expected an Object"

instance ToJSON Post where
  toJSON post = object 
    [ "id" .= postId post
    , "type" .= typ post
    , "story" .= story post
    ]

main :: IO ()
main = do
  print $ (decode $ Post "{\"type\": \"myType\", \"story\": \"Really interresting story\", \"id\" : \"SomeId\"}" :: Maybe Post)
  LBS.putStrLn $ encode $ Post "myId" "myType" "Some other story"

对于 Feed 也可以这样做。如果您不必忽略字段,也可以使用 deriveJSON来自 Data.Aeson.TH ,它接受一个函数来修改字段名称作为它的第一个参数。

关于haskell - 使用包含保留关键字的字段名解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18410686/

相关文章:

haskell - 消失的应用程序?

list - 将函数映射到定义为数据结构列表的新类型

haskell - Data.Aeson 中的模式匹配向量值

haskell - 如何为具有 kind (* -> *) -> * 的类型编写 aeson ToJSON 实例

haskell - 为什么 ByteString 不会自动转换为 FilePath?

haskell - 如何将 stdout/stderr 通过管道传输到 Turtle 中另一个命令的 stdin?

algorithm - Haskell 中的 Maze Solver - 确定迷宫是否无法解决

haskell - Haskell 中多核编程的现状如何?

Haskell:重用带有镜头、镜头-aeson 和嵌套 JSON 的 FromJSON 实例

json - 使用动态 JSON 字段对类型进行建模的 Haskell 方式?