Aeson:解析 json 对象以列出

Aeson: Parse json object to list

我想将 json 对象的值解析为列表。

这是我目前的方法(经过简化,新类型基于以下结果:(意味着我需要它)):

Json:

{"v1": 1, "v2": 2}

想要的结果:

Test [1,2]

当前方法:

import Data.Aeson
import Data.HashMap.Strict (elems)

newtype Test = Test [Int]
instance FromJSON Test where
  parseJSON (Object o) =
    mapM parseJSON (elems o)

编译错误:

• Couldn't match type ‘[b0]’ with ‘Test’
  Expected type: aeson-1.1.2.0:Data.Aeson.Types.Internal.Parser Test
    Actual type: aeson-1.1.2.0:Data.Aeson.Types.Internal.Parser [b0]
• In the expression: mapM parseJSON (elems o)

mapM parseJSON (elems o)returnsParser [Int],但是你需要Parser (Test [Int]),所以正确的做法是:

instance FromJSON Test where
    parseJSON (Object o) = Test <$> mapM parseJSON (elems o)

但是parseJSON的参数类型是Value,参数的值可以不是Object,也可以是ArrayString 等等,所以最好使用 withObject 来检查它是什么:

instance FromJSON Test where
    parseJSON val = withObject "Test" 
                               (\o -> Test <$> mapM parseJSON (elems o))
                               val
当类型 Value 的值不是 Object.

时,

withObject 将打印一条有意义的错误消息