Чтение одного поля объекта с использованием Aeson без записи экземпляра FromJSON - PullRequest
0 голосов
/ 17 января 2019

Как мне прочитать одно поле (по имени) из объекта JSON, используя Aeson, без записи какого-либо экземпляра класса типа?

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать 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
...