2013-03-04 76 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