Haskell (Aeson): как создать запись из JSON с дополнительными значениями - PullRequest
0 голосов
/ 18 мая 2018

У меня есть запись, которую я хочу построить с некоторыми значениями из строки JSON, а также с некоторыми дополнительными значениями.

Например - с учетом следующей записи:

data MyRecord = MyRecord { a :: String, b :: Int, c :: String }

Я хочу определить функцию:

createMyRecord :: String -> String -> Maybe MyRecord
createMyRecord json cValue = ???

которую я хочу вызывать так:

createMyRecord "{\"a\": \"a value\", \"b\": 100}" "c value"

В настоящее время я делаю это, используя Aeson для создания записисо значениями по умолчанию (то есть пустыми строками и нулями) для значений, которые не приходят из JSON.Затем я создаю новую версию записи с обновленными другими полями.Примерно так:

instance FromJSON MyRecord where
    parseJSON = withObject "MyRecord" $ \o -> do
        valueA <- o .: "a"
        valueB <- o .: "b"
        return MyRecord { a = valueA, b = valueB, c = "" }

createMyRecord :: String -> String -> Maybe MyRecord
createMyRecord json cValue =
    Aeson.decode json <$> (\r -> r { c = cValue })

Это кажется немного громоздким - я хотел бы создать запись за один раз со всеми значениями, а не заполнять их пошагово.Есть ли лучший способ сделать это с Aeson (я открыт для других библиотек), который кто-нибудь может порекомендовать?

Спасибо!

1 Ответ

0 голосов
/ 19 мая 2018

Вы хотите построить parseJSON?Это не должно быть parseJSON ...

abParser :: String -> Value -> Parser MyRecord
abParser valueC = withObject "MyRecord" $ \o -> do
    valueA <- o .: "a"
    valueB <- o .: "b"
    return MyRecord { a = valueA, b = valueB, c = valueC }

createMyRecord :: ByteString -> String -> Maybe MyRecord
createMyRecord json valueC = decode json >>= parseMaybe (abParser valueC)
...