У меня есть запись, которую я хочу построить с некоторыми значениями из строки 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 (я открыт для других библиотек), который кто-нибудь может порекомендовать?
Спасибо!