Я пытаюсь создать собственный конвертер json для объекта с вложенными объектами для отправки в виде тела в Firestore REST API:
public class Channel
{
public string Name { get; private set; }
public long OwnerId { get; private set; }
public IEnumerable<Message> Messages { get; set; }
public IEnumerable<User> Users { get; set; }
}
public class User
{
public string UserId{ get; private set; }
public string Pseudonym { get; private set; }
}
public class Message
{
public long SenderUserId { get; private set; }
public string text { get; private set; }
public DateTime SentDate { get; private set; }
}
При сериализации структура json должна выглядеть так:
{
"OwnerId": {
"stringValue": "id-1"
},
"Name": {
"stringValue": "New Channel"
},
"Messages": {
"arrayValue": {
"values": [
{
"mapValue": {
"fields": {
"ConversationMessage": {
"stringValue": "Hello kev"
},
"SenderUserId": {
"stringValue": "id-1"
}
}
}
}
]
}
},
"Users": {
"arrayValue": {
"values": [
{
"mapValue": {
"fields": {
"UserId": {
"stringValue": "id-1"
},
"Pseudonym": {
"stringValue": "raven"
}
}
}
},
{
"mapValue": {
"fields": {
"UserId": {
"stringValue": "id-2"
},
"Pseudonym": {
"stringValue": "kev"
}
}
}
}
]
}
}
}
Firestore навязывает эту структуру, свойство становится объектом с типом в качестве ключа, а значение в качестве значения (строка становится stringValue, IEnumerable становится arrayValue со значениями, объект становится mapValue с полями ...)
Должен ли я создавать конвертер для каждого объекта или только один конвертер для объекта Channel? Любые ответы или помощь будут очень признательны, спасибо!
StringConverter
, ArrayConverter
и т. д.
В вашей модели данных OwnerId
- это long
, но в JSON это явно строка: "stringValue": "id-1"
. Это ошибка или есть какое-то специальное правило преобразования для идентификаторов? У вас есть список правил, необходимых для преобразования обычного JSON в JSON-хранилище? Например, вложенный Message
получает свойство "mapValue"
, а корневой объект Channel
- нет.
Боюсь, это слишком много для Stack Overflow. Вам придется попробовать и вернуться сюда, когда вы застрянете.