gpt4 book ai didi

json - 在 Haskell 中构建 JSON 类型

转载 作者:行者123 更新时间:2023-12-04 02:23:59 25 4
gpt4 key购买 nike

我一直在研究 Haskell 的 JSON 模块,我想手动创建一些 JSON,接近于此:

{
"data": { "unit": "cm" },
"name": "Hodor"
}

所以我尝试了这样的事情:

toJSObject [ 
("data", toJSObject [ ("unit", toJSString "cm") ]),
("name", toJSString "Hodor")
]

但是,我一直遇到类型不匹配的问题,因为 data 字段的类型是 JSObject JSString,而 name 字段的类型是 JSString。为什么它不能推断一般类型 JSValue —— JSObjectJSString 都应该是一个子类型。我错过了什么?

提前致谢!

最佳答案

正如 J. Abrahamson 指出的那样,Haskell 中没有子类型多态性,因此您无法表示不同 类型的列表。 Aeson 库(事实上的 JSON 库)提供的 JSON Value 和类型可用于构建 JSON“异构”JSON,其中所有值都包含在统一的 Value 输入。

type Object = HashMap Text Value

type Array = Vector Value

-- | A JSON value represented as a Haskell value.
data Value = Object !Object
| Array !Array
| String !Text
| Number !Scientific
| Bool !Bool
| Null

使用它我们创建了一个类型 M.HashMap Text Value 并将其包装在一个对象中。

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import qualified Data.HashMap.Strict as M

example :: Value
example = Object $ M.fromList [
("data", Object $ M.fromList [ ("unit", "cm") ]),
("name", "Hodor")
]

main = print $ encode example

它为您提供惰性字节串:{"data":{"unit":"cm"},"name":"Hodor"}

关于json - 在 Haskell 中构建 JSON 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com