问题标签 [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 回答
997 浏览

haskell - 我能在多大程度上让 Aeson 承担重任?

我试图避免为 toJSON 编写定义。这是我遇到的错误:

我的所有 HashMapdata声明都出现了类似的错误。

这是相关的代码。让我知道是否缺少信息。

我无法创建实例,Data.Aeson.Types.Class.GToJSON因为Data.Aeson.Types.Class 未导出。我有哪些选择?我必须手动写什么?是deriveJSON最好的选择吗?

更新:我实施了以下建议。这是代码

第一个实例产生Object fromList [("key",Array (fromList []))])

二审结果Object fromList [("name",Array (fromList []))]

知道为什么name而且key是空的吗?

我怎么知道?

使用它会更容易吗deriveJSON

更新:感谢 NathanHowell 的帮助,更重要的问题已经解决,即一元类型的 GToJSON 实例。解决方案是为一元类型创建自己的实例。JSON 对象出现故障,但我不知道这是否重要。如果是这样,那么 Fields 的另一个手动 ToJSON 实例似乎可以解决这个问题。

更新:好的一点上下文。我正在编写一个 JIRA 前端。我之所以提到这一点,是因为将来人们可能会来这里发现以下好消息:JIRA 不关心对象顺序。

0 投票
1 回答
252 浏览

json - 记录的数据验证

您是否知道任何 Haskell 库

  1. 为记录验证和(!)提供了一些简化
  2. Aeson 合作

我知道我可以编写一些构造函数,但我想删除样板而不重新发明轮子。

我正在寻找的是以下内容:

我想为每个字段定义“合同”。例如:

现在,我想保证在我将 JSON 解析到记录中之后,以下内容成立:

  1. [0,Inf) 中的年龄
  2. 电子邮件匹配“^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[AZ]{2,6}$”
  3. 项目至少包含 2 个项目

如果我尝试创建年龄 < 0 的记录,我将收到一条错误消息,例如“age=0 no in [0,inf)”。我认为应该可以通过模板 Haskell 派生这样的东西。

此外,我想将其集成到解析器阶段。因此,我不想收到一条错误消息,例如“当预期是一个 Integral,而是遇到了 String”,我想收到一条错误消息,

  1. 显示错误的位置(不确定 attoparsec 是否可行)
  2. 描述错误。
0 投票
2 回答
268 浏览

json - 如何应对 Haskell 命名空间?

我正在写一个data记录来编组一个JIRA JSON对象。问题是,多个对象具有相同的名称/值对标签。例如 :

(从 curl 返回并格式化)

当我构建有问题的相应 Haskelldata记录时,我得到:

'id' 和 'self' 会发生冲突。我突然想到,我可以通过更改记录中的名称并使用手动创建的FromJSON实例来修复它来解决这个问题。欢迎任何替代解决方案。

0 投票
1 回答
314 浏览

xml - 为什么这段代码会产生段错误?

我正在尝试编写一个从 api 解析 xml、剥离一些信息并将结果打印为 json 的模块,但我在打印步骤中遇到了问题。如果我打印节目,我确实看到那里有正确的数据,但是,应该将记录转换为 json, 的调用encode shows会产生段错误。

编辑:正如 user1891025 所指出的,这可能是我的机器或软件包版本的问题。

  • 系统:Ubuntu 11.04 32bit
  • 爱生 v0.6.1.0
  • GHC v7.2.1

这个问题越来越具体,所以我会把它带到 irc,但如果有人有任何帮助,请告诉我!

0 投票
1 回答
1378 浏览

haskell - 为什么图书馆设计者在 Text 似乎合适的地方使用 ByteString?

在我的应用程序上工作时,我偶然发现了Aeson 无法解码 UTF8 input的问题。深入挖掘我发现它依赖于Parser ByteStringAttoparsec,这对我来说似乎是问题的根源。但这实际上不是我在这里要问的。

问题是它不是我见过人们使用的唯一地方ByteString,这对我来说似乎很明显,只有Text合适的地方,因为 JSON 不是一些二进制文件,它是可读的文本,它很可能包含 UTF8 字符。

所以我想知道我是否遗漏了一些东西并且有正当的理由可以选择ByteStringText或者这只是由于大多数人不太关心拉丁文以外的任何其他字符集而导致的糟糕库设计的普遍现象。

0 投票
3 回答
1225 浏览

haskell - 为什么 GHC Haskell 不支持重载记录参数名称?

我在说的是无法定义:

我知道 GHC 只是将其简化为普通函数,解决此问题的惯用方法是:

写完后我不太喜欢它……这种类型分类不能成为脱糖过程的一部分吗?


当我写一些 Aeson JSON 解析时,我想到了。如果只为每种数据类型派生FromJSON实例太容易了,我必须手动写出所有内容(目前 > 1k 行并计数)。在数据记录中具有类似name或简单的名称value并不少见。

http://www.haskell.org/haskellwiki/Performance/Overloading提到函数重载会引入一些运行时开销。但我实际上不明白为什么编译器无法在编译时解决这个问题并在内部给它们不同的名称。

这个 2012 年的 SO 问题或多或少地说明了历史原因,并指向了 2006 年的一个邮件线程。最近有什么变化吗?

即使会有一些运行时开销,大多数人也不会介意,因为大多数代码几乎不是性能关键。

是否有一些隐藏的语言扩展实际上允许这样做?我再次不确定......但我认为伊德里斯实际上是这样做的?

0 投票
1 回答
696 浏览

json - 如何在 Aeson 中匹配数组

尝试处理 JSON 数据时,haskell 中的初学者问题。

我有一个名为kk的简单文件,其内容如下:

我正在使用以下代码成功读取和解析它:

但是,如果它是一个数组,我似乎无法确定我应该如何处理该文件,这意味着:

如何折叠或以其他方式迭代数组案例?

0 投票
1 回答
1025 浏览

json - 在haskell中用aeson解析部分json对象

我在 Haskell 中使用 Warp(可能还有 Scotty)和酸状态制作了一个相当简单的 CRUD Web 服务。

在酸性状态下,我将用户记录存储在 Data.Map 中(根据示例)。我知道这些记录在创建时总是完整的,所以我不需要用很多 MaybeS 来获得资格。但是,在更新用户时,客户端可能会选择发送部分 json 对象,其中仅填充一些字段。

表示这一点的惯用方式是什么?我是否应该在所有可选键PartialUser前面有一个数据声明FullUser,没有MaybeS,而一个与MaybeS完全相同,并让aeson自动为后者派生编码和解码,最后编写我自己的类型更新函数:: FullUser -> PartialUser -> FullUser?

它不会有太多代码,但感觉有点难看,并且有点违反 DRY。它应该是 Web 服务器中的一项常见任务,所以也许它已经普遍解决了(可能使用 TH)?

我意识到我可以只存储 json 字符串并始终检查丢失的键,这使它稍微笨拙但更多的未来证明模式更改,但我仍然想知道如何以“类型安全”的方式进行操作。

编辑:或者也许我应该只有 FullUser 并使用 aeson-lens 从 FullUser 和 json 字符串编写一个简单的更新函数?

0 投票
1 回答
281 浏览

regex - Haskell:aeson、OverloadedStrings 和 Text.Regex.PCRE

我有一个使用 Text.Regex.PCRE 的正则表达式,效果很好:

但是,我在 {-# LANGUAGE OverloadedStrings #-} 中添加了使用 aeson(json 库)并在 =~ 上得到一个实例错误:

搜索修复似乎是将正则表达式更改为:

但这似乎只是给了我另一个实例错误:

放在这里的正确类型是什么?我尝试的任何方法似乎都不起作用。似乎 OverloadedStrings 是问题所在,但除了仅将 Data.Text.pack 与 aeson 一起使用之外,我找不到任何解决方案,但我想弄清楚我在使用正则表达式时做错了什么。我很好奇 Text.Regex 不能与 OverloadedStrings 一起使用是否存在问题,但我找不到任何证据。

0 投票
1 回答
521 浏览

haskell - 在 Aeson 中解码的“无”结果

我正在使用这段代码:

尝试像这样解析 JSON:

但是 main 每次都返回 Nothing 。我做错了什么?似乎连 parseJSON 都没有被称为 Original。