Я работал над небольшой библиотекой против API на основе JSON. Эта библиотека позволяет использовать в «опции» объекта, серия пар ключ-значение, которые определяют современное поведение:Анализ объекта опций для списка опций
{
"id": 1234
...
"options": {
"notify_no_data": True,
"no_data_timeframe": 20,
"notify_audit": False,
"silenced": {"*" :1428937807}
}
}
Я представлял концепцию опций в Haskell, используя список опций:
data Option = NotifyNoData NominalDiffTime -- notify after xyz
| NotifyAudit -- notify on changes
| Silenced (Maybe UTCTime) -- silence all notifications ("*") until xyz (or indefinitely)
newtype Options = Options [Option]
Реализация toJSON
была достаточно простой; Я создал экземпляр toJSON
для типа Option
, а затем использовал их как помощники для типа Options
.
instance ToJSON Option where
toJSON (Silenced mtime) =
Object $ Data.HashMap.fromList [("silenced", mapping)]
where stamp = maybe Null (jsonTime . floor . utcTimeToPOSIXSeconds) mtime
mapping = Object $ Data.HashMap.singleton "*" stamp
toJSON (NotifyNoData difftime) =
Object $ Data.HashMap.fromList [("notify_no_data", Bool True)
,("no_data_timeframe", stamp)]
where stamp = jsonTime $ floor (difftime/60)
toJSON NotifyAudit =
Object $ Data.HashMap.fromList [("notify_audit", Bool True)]
instance ToJSON Options where
toJSON (Options options) = Object $ Data.HashMap.unions $ reverse $ (opts:) $ map ((\(Object o) -> o) . toJSON) options
where opts = Data.HashMap.fromList [("silenced", Object Data.HashMap.empty)
,("notify_no_data", Bool False)
,("notify_audit", Bool False)]
Проблема Я бегу в в fromJSON
реализации для Options
. Все варианты использования, которые я видел перед поставкой довольно простого json-object-представления для сопоставления представления данных. Что мне нужно сделать, так это преобразовать объект в объект опций в список представлений данных (Option). Например, образец JSON в разделе «варианты», которые я дал в начале бы стать:
Options [NotifyNoData 20, Silenced (Just (posixSecondsToUTCTime 1428937807))]
FromJSON
требует осуществления parseJSON :: FromJSON a => Value -> Parser a
. У меня возникли проблемы с пониманием того, как создать Parser, используя эту необязательную структуру объектов, предоставленную API. Существует ли стандартный подход к синтаксическому анализу объекта JSON для такого списка? Возможно, я не в полной мере понимаю класс Parser
.