使用 Aeson 读取对象的单个字段而无需编写 FromJSON 实例
Read single field of object using Aeson without writing a FromJSON instance
如何使用 Aeson 从 JSON 对象中读取单个字段(按名称),而不写入任何类型 class 实例?
您可以使用 decode
将 JSON ByteString
读取为 Maybe Value
,因为 Value
已经有一个 FromJSON
实例:
*Q54233506 Q54233506> :set -XOverloadedStrings
*Q54233506 Q54233506> decode "{ \"foo\": \"bar\", \"baz\": 42 }" :: Maybe Value
Just (Object (fromList [("foo",String "bar"),("baz",Number 42.0)]))
从那里,您可以使用 中描述的技术之一从 Value
中提取数据。
例如,您可以使用 lens-aeson 中的镜头来提取 foo
和 baz
值:
*Q54233506 Q54233506> :set -XOverloadedStrings
*Q54233506 Q54233506> v = decode "{ \"foo\": \"bar\", \"baz\": 42 }" :: Maybe Value
*Q54233506 Q54233506> v >>= (^? key "foo")
Just (String "bar")
*Q54233506 Q54233506> v >>= (^? key "baz")
Just (Number 42.0)
您可以进一步组合 _String
或 _Number
以提取文本或数字:
*Q54233506 Q54233506> v >>= (^? key "foo") >>= (^? _String)
Just "bar"
*Q54233506 Q54233506> v >>= (^? key "baz") >>= (^? _Number)
Just 42.0
aeson-combinators
包包含允许 decoding/encoding JSON 的组合器,而不需要 FromJSON / ToJSON 实例。
这在一般情况下会非常方便,例如,当解码取决于 HTTP header 值等其他信息时。
对于您的情况,您可以使用 key :: Text -> Decoder a -> Decoder a
combinator 来
获取给定键的值。
看看吧!
如何使用 Aeson 从 JSON 对象中读取单个字段(按名称),而不写入任何类型 class 实例?
您可以使用 decode
将 JSON ByteString
读取为 Maybe Value
,因为 Value
已经有一个 FromJSON
实例:
*Q54233506 Q54233506> :set -XOverloadedStrings
*Q54233506 Q54233506> decode "{ \"foo\": \"bar\", \"baz\": 42 }" :: Maybe Value
Just (Object (fromList [("foo",String "bar"),("baz",Number 42.0)]))
从那里,您可以使用 Value
中提取数据。
例如,您可以使用 lens-aeson 中的镜头来提取 foo
和 baz
值:
*Q54233506 Q54233506> :set -XOverloadedStrings
*Q54233506 Q54233506> v = decode "{ \"foo\": \"bar\", \"baz\": 42 }" :: Maybe Value
*Q54233506 Q54233506> v >>= (^? key "foo")
Just (String "bar")
*Q54233506 Q54233506> v >>= (^? key "baz")
Just (Number 42.0)
您可以进一步组合 _String
或 _Number
以提取文本或数字:
*Q54233506 Q54233506> v >>= (^? key "foo") >>= (^? _String)
Just "bar"
*Q54233506 Q54233506> v >>= (^? key "baz") >>= (^? _Number)
Just 42.0
aeson-combinators 包包含允许 decoding/encoding JSON 的组合器,而不需要 FromJSON / ToJSON 实例。
这在一般情况下会非常方便,例如,当解码取决于 HTTP header 值等其他信息时。
对于您的情况,您可以使用 key :: Text -> Decoder a -> Decoder a
combinator 来
获取给定键的值。
看看吧!