问题标签 [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.

0 投票
1 回答
251 浏览

json - 使用 aeson 解析 JSON 以获得复合数据类型

我有以下数据类型:

我为 toJSON 提供了以下代码。它有效,但需要改进。它应该分别转换 Document 和 Directory,但我不知道该怎么做。

我需要能够从 JSON 解析 DocumentOrDirectory 对象。这就是我想出的(不起作用):

我应该如何修改现有代码才能将数据从 JSON 转换为 JSON?

0 投票
1 回答
1186 浏览

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 字符之后。不知道为什么它无法读取特殊字符之后的字符!

改为test2be 会test2 = decode $ pack "{ \"foo\": \"bòz\"}"给出错误:

这是“ò”的字符,这更有意义。

0 投票
1 回答
144 浏览

json - isNothing 解析 JSON 文件时抛出异常

我有以下函数可以使用该Data.Aeson库解码 JSON 文件:

而这个功能:

该函数getBook适用于许多 JSON 文件。这是一个例子:

JSON 内容已成功解码,因此在第一行isNothing返回,然后是解码后的内容。如果我将此 JSON 文件作为False再次运行该函数,我将得到以下输出:content

该文件无法解码(因为categoriesJSON 文件中没有字段),因此isNothing返回True,并Nothing打印在屏幕上。现在的问题是当我将此 JSON 文件作为content. 我明白了:

执行时抛出异常print (isNothing searchResult),我不明白为什么True不像前面的例子那样返回(因为在这种情况下没有 field industryIdentifiers,例如)。我错过了什么或做错了什么?

编辑:

我发现每次 JSON 文件不包含该字段时都会出现问题industryIdentifiers。它在这一行失败:

0 投票
1 回答
2014 浏览

haskell - 是否可以在派生 Generic 的记录数据类型中列出字段的名称和类型?

我知道对于派生 Data.Data 的数据类型,constrFields会给出字段名称列表。查看 GHC.Generics 文档,我认为同样应该是可能的Generic。(但悲惨地无法弄清楚自己该怎么做)。

更具体地说,我正在寻找两件事:

列出所有记录字段

...在 Haskell 程序中。我知道aeson能够自动推断派生的任何记录数据类型的 JSON 表示Generic,但阅读它的源代码只能证实我在这里一无所知。据我猜测,aeson 必须能够从记录数据类型中获取所有字段名称(如Strings 或ByteStrings),以及它们的类型(具有类似TypeRepData.Typeable 的类型,或以下实例Eq:任何可用于case块模式匹配的东西都可以)。

我模糊地假设为 , 等创建一个类和实例M1:*:一种方式,但我无法进入类型检查器。

检查记录选择器

获取其所属的记录数据类型,记录字段名(as String)等。

例如,给定

一个magic类似的功能

这些是可能的deriving Generic,还是我必须求助于 Template Haskell?

0 投票
1 回答
789 浏览

json - Aeson 和 Lens 与 DeriveGeneric 和 makeLenses - 名称不对齐

假设我有一个类型Person

我想为它自动派生 Lenses 和 JSON 类型类

这可以正常工作,但是 DeriveGeneric 将我的字段名称视为带有下划线,并希望我的 JSON 被相应地格式化。

显然,我可以从data定义本身中删除下划线,但随后makeLenses将无法派生所需的 getter 和 setter。

理想情况下,我想做的是这样的

即,我希望能够派生所有字段名称与我正在使用的 JSON-REST Api 中的值正确对齐的镜头和 JSON 实例,而无需编写太多样板文件。

这似乎是一件直截了当的事情,我觉得我错过了一些明显的东西?

0 投票
1 回答
458 浏览

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

这是我正在使用的一种形式的代码。起初,我尝试将其用作嵌入在另一种类型中的类型,但当这不起作用时,我添加了“值”键以尝试使解析更容易(不走运)。

0 投票
2 回答
214 浏览

haskell - 编写可选的 Aeson 解析器

这是代表用户的 JSON 对象的一部分:

我需要将其解析为一种User类型:

天真的解决方案:

但这并不比这些连锁店好多少:

这经常在“你为什么需要一个 Monad”的解释中得到证明

因此,我需要编写看起来像的解析器(.:? "url") :: Parser (Maybe a)

我试图用comp函数来描述这个组合:

闻起来像仿函数,但fmap对我没有帮助。

然后我决定,该组合必须继续:

Hoogle 搜索对我没有帮助,但浏览Control.Monad文档给了我 Kliesli 组合,我对此没有经验。我看到了一些相似之处:

不同之处在于,在合成过程中Maybe应该“展开”。

似乎我接近解决方案,但仍然找不到。请给我一些见解。

[更新]: 我决定实际问题的最佳解决方案是保留原始 JSON 结构并具有嵌套的用户类型:

这完全消除了我的问题,并使 API 与原始源代码更兼容。

但是,仅出于理论目的,很高兴看到如何解决原始问题。

0 投票
1 回答
538 浏览

parsing - 如何在使用 Data.Aeson 解析 JSON 时正确出错

我的类型和对应的 FromJSON 实现如下所示。

nonEmptyaList变为 a Maybe NonEmpty,我正在尝试正确处理List确实为空并且我必须中止解析的情况。这个解析实际上是在 内部完成的parseJsonBody,这意味着我不想error "foo"摆脱它,但我想返回mzero(或者其他任何可以解决问题的方法,这mzero是我迄今为止唯一偶然发现的东西)所以处理程序正确返回 400 而不是以 500 崩溃。

下面的方法可以编译,但据我所知,它几乎等于error或在 parseJSON 内抛出某种其他形式的异常。但是,如果我返回mzero(例如,用<*> mzero而不是那条线),它会按预期很好地失败。

一种选择是以某种方式对 的结果进行模式匹配fmap NE.nonEmpty (o .: "responses"),但我不太清楚那里的模式是什么:看起来 Parser 没有任何构造函数吗?

0 投票
1 回答
114 浏览

haskell - 是否可以使 Traversal 成为 IsString 的实例

我想使用字符串文字作为遍历,但我有点迷失在类型上。是否可以创建此实例?

在 State monad 中实现这样的目标:

普遍量化类型实例的问题。谢谢!

0 投票
1 回答
383 浏览

haskell - 如何检查解析的 Aeson 值?

我怎样才能浏览大Aeson Values?我知道应该有一个我感兴趣的字符串嵌套在结构的某个地方。我怎样才能找到它?

到目前为止,我只知道如何查询构造函数并发现它是一个数组。我怎么能比这更深入呢?