У меня есть пара типов, User
и Post
. Post
создается User
.
Моя база данных выглядит так же, как мои типы, которые
data User = { userID :: Integer, name :: String }
data Post = { content :: String, authorID :: Integer } -- authorID is the userID
Предполагая, что у меня есть действительные экземпляры To/FromJSON на основе этих типов, как мне условно включить значение в вывод моего JSON?
В качестве примера я могу просмотреть «профиль» пользователя, который будет включать все Post
, созданные User
. В других случаях я могу захотеть просмотреть различные User
в системе, поэтому нет смысла возвращать Post
, которые они сделали.
У меня нет проблем с получением Post
s для данного User
, и у меня нет проблем с получением User
заданного Post
. Я просто хочу знать, как лучше всего условно добавить ключ в мой JSON.
Кто-то упомянул мне, что я должен добавить поле к User
для posts :: Maybe [Post]
и добавить author :: Maybe User
к моему типу Post
. Хотя это будет работать для довольно маленьких типов, я чувствую, что некоторые типы с большим количеством отношений будут довольно большими и потенциально сложными в обслуживании.
Я также думал об использовании Map Text Data.Aeson.Value
для создания/сериализации моей информации, но вы теряете большую часть (все?) Безопасность типов, делая что-то подобное.
ИЗМЕНИТЬ
Основываясь на приведенных выше типах данных, я определил следующие экземпляры ToJSON.
instance ToJSON User where
toJSON (User i n) = object [ "id" .= i, "name" .= n ]
instance ToJSON Post where
toJSON (Post c a) = object [ "content" .= c, "author_id" .= a ]
Это дало бы мне «простой» вывод json, что-то вроде User
:
{
"id": 4,
"name": "User Name"
}
Post
:
{
"content": "This is the content of my post",
"author_id": 4
}
Это может быть полезно, особенно при поиске предметов. Это позволяет отображать только ограниченный объем информации.
Я мог бы сделать что-то вроде
instance ToJSON User where
toJSON (User i n) = object [ "id" .= i, "name" .= n, "posts" .= posts i ]
Что дало бы мне информацию о пользователях, а также все сообщения, связанные с этим пользователем, при условии допустимого определения posts
. Это дало бы мне JSON, похожий на
{
"id": 4,
"name": "User Name",
"posts": [
{
"content": "This is some content",
"author_id": 4
}
]
}
Я не понимаю, как я мог бы динамически устанавливать, какие поля я хотел бы отправить клиенту. Можно ли определить несколько экземпляров ToJSON и выбрать, какой экземпляр я хотел бы использовать для данного запроса? Или я должен просто сделать то, что было предложено ранее, и включить поле posts
в мой тип User
, который может содержать Maybe [Post]
?
Foo -> Value
, они не должны называтьсяtoJSON
. - person Daniel Wagner   schedule 18.12.2015