2013-03-04 32 views
7

我在Haskell中用Warp(也可能是Scotty)和酸态做出了一个相当简单的CRUD web服务。在haskell中用aeson解析部分json对象

在acid-state中,我将用户记录存储在Data.Map中(根据this示例)。我知道这些记录在创建时总是完整的,所以我不需要许多MaybeS的资格。但是,更新用户时,客户端可能会选择发送部分json对象,只填写一些字段。

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

它不会有太多的代码,但它感觉有点丑陋,就像它有点违反DRY。它应该是一个Web服务器中的常见任务,所以它可能已经被一般地解决了(可能与TH)?

我意识到我可以只存储json字符串,并且总是检查缺少的键,这使得它稍微笨拙,但是对于模式更改有更多未来的证据,但是我仍然想知道我将如何在“类型安全“ 办法。

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

回答

7

地道的Haskell正在做尽可能多的静态检查。您应该始终从可以用静态替换动态检查的角度来处理您的问题。这基本上就是Haskell关于现实的一个非常接近的陈述:“如果它编译,它就可以工作”。所以绝对是一个“不”,用纯JSON工作。

FullUserPartialUser的解决方案是正确的。虽然我会建议采取不同的命名方法:UserUserJSON - 这样您就可以得到一个相当具有描述性和合理的含义。

但是,艾森有一个小问题:生成的实例don't yet support parsing missing fields(请对此问题投票)。所以你必须手动定义实例。

+0

感谢您的输入!是的,命名只是为了使问题更清楚。由于生成的实例在这种情况下不够用,我想我会使用一个更新函数,该函数需要一个FullUser和一个json字符串,并使用aeson镜头(也许是FullUser的镜头)来更新它。 – Gurgeh 2013-03-04 21:32:55