问题标签 [aeson]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
json - 使用 aeson 解析 JSON 以获得复合数据类型
我有以下数据类型:
我为 toJSON 提供了以下代码。它有效,但需要改进。它应该分别转换 Document 和 Directory,但我不知道该怎么做。
我需要能够从 JSON 解析 DocumentOrDirectory 对象。这就是我想出的(不起作用):
我应该如何修改现有代码才能将数据从 JSON 转换为 JSON?
haskell - Aeson 不解码带有 unicode 字符的字符串
我正在尝试使用 Data.Aeson ( https://hackage.haskell.org/package/aeson-0.6.1.0/docs/Data-Aeson.html ) 来解码一些 JSON 字符串,但是它无法解析字符串包含非标准字符。
例如,文件:
在 ghci 中运行时,会给出以下结果:
是否有理由不使用 unicode 字符解析字符串?我的印象是 Haskell 对 unicode 非常好。任何建议将不胜感激!
谢谢,
泰蒂吉
编辑
使用 进一步调查后eitherDecode
,我收到以下错误消息:
x61
是 'z' 的 unicode 字符,紧跟在特殊的 unicode 字符之后。不知道为什么它无法读取特殊字符之后的字符!
改为test2
be 会test2 = decode $ pack "{ \"foo\": \"bòz\"}"
给出错误:
这是“ò”的字符,这更有意义。
json - isNothing 解析 JSON 文件时抛出异常
我有以下函数可以使用该Data.Aeson
库解码 JSON 文件:
而这个功能:
该函数getBook
适用于许多 JSON 文件。这是一个例子:
JSON 内容已成功解码,因此在第一行isNothing
返回,然后是解码后的内容。如果我将此 JSON 文件作为False
再次运行该函数,我将得到以下输出:content
该文件无法解码(因为categories
JSON 文件中没有字段),因此isNothing
返回True
,并Nothing
打印在屏幕上。现在的问题是当我将此 JSON 文件作为content
. 我明白了:
执行时抛出异常print (isNothing searchResult)
,我不明白为什么True
不像前面的例子那样返回(因为在这种情况下没有 field industryIdentifiers
,例如)。我错过了什么或做错了什么?
编辑:
我发现每次 JSON 文件不包含该字段时都会出现问题industryIdentifiers
。它在这一行失败:
haskell - 是否可以在派生 Generic 的记录数据类型中列出字段的名称和类型?
我知道对于派生 Data.Data 的数据类型,constrFields
会给出字段名称列表。查看 GHC.Generics 文档,我认为同样应该是可能的Generic
。(但悲惨地无法弄清楚自己该怎么做)。
更具体地说,我正在寻找两件事:
列出所有记录字段
...在 Haskell 程序中。我知道aeson能够自动推断派生的任何记录数据类型的 JSON 表示Generic
,但阅读它的源代码只能证实我在这里一无所知。据我猜测,aeson 必须能够从记录数据类型中获取所有字段名称(如String
s 或ByteString
s),以及它们的类型(具有类似TypeRep
Data.Typeable 的类型,或以下实例Eq
:任何可用于case
块模式匹配的东西都可以)。
我模糊地假设为 , 等创建一个类和实例M1
是:*:
一种方式,但我无法进入类型检查器。
检查记录选择器
获取其所属的记录数据类型,记录字段名(as String
)等。
例如,给定
一个magic
类似的功能
这些是可能的deriving Generic
,还是我必须求助于 Template Haskell?
json - Aeson 和 Lens 与 DeriveGeneric 和 makeLenses - 名称不对齐
假设我有一个类型Person
我想为它自动派生 Lenses 和 JSON 类型类
这可以正常工作,但是 DeriveGeneric 将我的字段名称视为带有下划线,并希望我的 JSON 被相应地格式化。
显然,我可以从data
定义本身中删除下划线,但随后makeLenses
将无法派生所需的 getter 和 setter。
理想情况下,我想做的是这样的
即,我希望能够派生所有字段名称与我正在使用的 JSON-REST Api 中的值正确对齐的镜头和 JSON 实例,而无需编写太多样板文件。
这似乎是一件直截了当的事情,我觉得我错过了一些明显的东西?
haskell - 带有 aeson 的 Haskell ADT
我一直在与一个简单的 ADT 作斗争,试图让它来回往返于 JSON,但无论我如何尝试按摩或修改类型,我都没有运气。我错过了什么?
当它编译时,我总是得到相同的运行时错误:
尝试这个只会给我“什么都没有”,大概是因为同样的错误:decode $ encode t
我试图遵循这些来源,但无论我尝试什么,我似乎都无法解决这个运行时错误: Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/用户/Geraldus/代数数据类型-adts-with-aeson
这是我正在使用的一种形式的代码。起初,我尝试将其用作嵌入在另一种类型中的类型,但当这不起作用时,我添加了“值”键以尝试使解析更容易(不走运)。
haskell - 编写可选的 Aeson 解析器
这是代表用户的 JSON 对象的一部分:
我需要将其解析为一种User
类型:
天真的解决方案:
但这并不比这些连锁店好多少:
这经常在“你为什么需要一个 Monad”的解释中得到证明
因此,我需要编写看起来像的解析器(.:? "url") :: Parser (Maybe a)
我试图用comp
函数来描述这个组合:
闻起来像仿函数,但fmap
对我没有帮助。
然后我决定,该组合必须继续:
Hoogle 搜索对我没有帮助,但浏览Control.Monad
文档给了我 Kliesli 组合,我对此没有经验。我看到了一些相似之处:
不同之处在于,在合成过程中Maybe
应该“展开”。
似乎我接近解决方案,但仍然找不到。请给我一些见解。
[更新]: 我决定实际问题的最佳解决方案是保留原始 JSON 结构并具有嵌套的用户类型:
这完全消除了我的问题,并使 API 与原始源代码更兼容。
但是,仅出于理论目的,很高兴看到如何解决原始问题。
parsing - 如何在使用 Data.Aeson 解析 JSON 时正确出错
我的类型和对应的 FromJSON 实现如下所示。
将nonEmpty
aList
变为 a Maybe NonEmpty
,我正在尝试正确处理List
确实为空并且我必须中止解析的情况。这个解析实际上是在 内部完成的parseJsonBody
,这意味着我不想error "foo"
摆脱它,但我想返回mzero
(或者其他任何可以解决问题的方法,这mzero
是我迄今为止唯一偶然发现的东西)所以处理程序正确返回 400 而不是以 500 崩溃。
下面的方法可以编译,但据我所知,它几乎等于error
或在 parseJSON 内抛出某种其他形式的异常。但是,如果我返回mzero
(例如,用<*> mzero
而不是那条线),它会按预期很好地失败。
一种选择是以某种方式对 的结果进行模式匹配fmap NE.nonEmpty (o .: "responses")
,但我不太清楚那里的模式是什么:看起来 Parser 没有任何构造函数吗?
haskell - 是否可以使 Traversal 成为 IsString 的实例
我想使用字符串文字作为遍历,但我有点迷失在类型上。是否可以创建此实例?
在 State monad 中实现这样的目标:
普遍量化类型实例的问题。谢谢!
haskell - 如何检查解析的 Aeson 值?
我怎样才能浏览大Aeson
Values
?我知道应该有一个我感兴趣的字符串嵌套在结构的某个地方。我怎样才能找到它?
到目前为止,我只知道如何查询构造函数并发现它是一个数组。我怎么能比这更深入呢?