2013-10-21 23 views
4

試用Edward Kmett的心靈擴展鏡頭和lens-aeson包。這裏有一個熱身解析json與lens-aeson

s = "{ \"somekey\" : [ { \"deeperkey\" : 1} , {\"deeperkey\": 2, \"otherkey\":3}]} 

期望的結果是

[(1, Nothing), (2, Just 3)] 

我可以做一點進步與

import Control.Lens.Aeson 
import Control.Lens 
import Control.Monad 
import qualified Data.Vector as V 

λ> s ^. key "somekey" . _Array . to V.toList >>= (^.. key "deeperkey" . _Number) 
[1,2] 

但我到目前爲止還沒有弄清楚如何工作的組合子硬足以得到正確的答案。 我最有可能涉及片段'鑰匙'otherkey''。有任何想法嗎?

回答

3

試試這個

s ^.. key "somekey" . _Array . traverse 
        . to (\o -> (o ^?! key "deeperkey" . _Number 
           , o ^? key "otherkey" . _Number 
           ) 
         ) 

隨着(^..)來從traverseTraversalArray多個元素在"somekey"插槽匹配的多重價值。技術上key "deeperkey"應該被允許失敗,但根據你的返回類型,你正在做出強有力的假設,它不會---所以我們使用(^?!)來做失敗的(^?)沒有Maybe monad保護。

+0

超級接近! 's^..鍵「somekey」。 _陣列。遍歷。到(\ o - >(o^?! key「deeperkey」。_Number,o ^?key「otherkey」._Number))'得到 '[(1,Nothing),(2,Just 3)]''。 如果您爲未來的讀者編輯答案,我會標記回答的問題。 –

+0

現在錯過了單身! –