C # / MongoDB десериализация массива словарей - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь создать массив массивов словарей в ASP.NET Core, используя MongoDB.В конце концов, данные должны сохранить эту модель для всех применений:

Модель

{
    "ContextName": "Base rates",
    "Indexes": [
        {
            "IndexName": "S&P",
            "IndexValues" : [
                {
                    "Date": "2019-01-01",
                    "Value": "2600.98"
                },
                {
                    "Date": "2019-01-02",
                    "Value": "2605.98"
                }              
            ]
        }
    ]
}

В настоящее время мой первый слой, определенный ниже, включает ContextNameи Indexes:

Context.cs

public class Context
    {
        [BsonId]
        [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
        public string Id { get; set; }
        [BsonElement("ContextName")]
        public string ContextName { get; set; }
        [BsonElement("Indexes")]
        public ICollection<Index> Indexes { get; set; }
    }

с Index, имеющим следующую структуру:

Index.cs

public class Index
    {
        [BsonElement("IndexName")]
        public string IndexName { get; set; }
        [BsonElement("IndexValues")]
        [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
        public Dictionary<DateTime, double> IndexValues { get; set; }
    }

При запуске этого кода я встречаю исключение формата, сообщающее

Произошла ошибка при десериализации свойства IndexValues ​​класса Database.Index: недопустимый элемент: 'Дата '.'

Сначала я подумал, что это проблема с ключом типа Date, а не string в самой базе данных, однако я прочитал здесьближе к , что официальный драйвер фактически поддерживает это.

Я пошел немного дальше, чтобы попытаться установить пользовательский { get; set; } для ввода ключа в виде строки, но меня встречает та же ошибкав конце концов.

public Dictionary<DateTime, double> IndexValues
        {
            get
            {
                Dictionary<DateTime, double> _indexValues = new Dictionary<DateTime, double>();
                foreach (var indexValue in IndexValues)
                {
                    _indexValues.Add(indexValue.Key, indexValue.Value);
                }
                return _indexValues;
            }
            set { IndexValues = IndexValues; } // Unsure about here as well
        }

Я не уверен, что смотреть на этот случай, иищу несколько указателей, чтобы понять это.Заранее спасибо.

Обновление

Форматирование словаря во внешнем методе допускает правильный формат, но также добавляет одно дополнительное поле, поскольку оно используется для сбора всехнеобходимая информация.

public Dictionary<DateTime, double> IndexValuesDictionary
        {
            get { return SetDictionary(); }
            set { SetDictionary(); }
        }

        private Dictionary<DateTime, double> SetDictionary()
        {
            if (_indexValues == null)
            {
                _indexValues = new Dictionary<DateTime, double>();
                foreach (var indexValue in IndexValues)
                {
                    _indexValues.Add(indexValue.Date, indexValue.Value);
                }
            }
            return _indexValues;
        }
{
        "id": "5c93c1123369220b685719b3",
        "contextName": "Base rates",
        "indexes": [
            {
                "indexName": "S&P",
                "indexValues": [
                    {
                        "date": "2019-01-01T00:00:00Z",
                        "value": 2600.98
                    },
                    {
                        "date": "2019-01-02T00:00:00Z",
                        "value": 2605.98
                    }
                ],
                "indexValuesDictionary": { // This should not be included
                    "2019-01-01T00:00:00Z": 2600.98,
                    "2019-01-02T00:00:00Z": 2605.98
                }
            }
        ]
    }

Является ли это единственно возможным вариантом для этого выхода?

1 Ответ

0 голосов
/ 02 апреля 2019

Сделав шаг назад и взглянув на структуру данных, я смог заставить это работать, удалив вложенность массива и работая исключительно с вложением документов (что, к сожалению, упрощает схему).Обновленная структура базы данных:

[
    {
        "ContextName": "Base rates",
        "Description": "Base rates description",
        "Indexes": {
            "SPX": {
                "2019-01-01T00:00:00Z": 2600.98
            },
            "NDX": {
                "2019-01-01T00:00:00Z": 6600.98
            }
        }
    }
]

Оставив структуры классов обновленными как:

Context.cs

public class Context
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
        [BsonElement("ContextName")]
        public string ContextName { get; set; }
        [BsonElement("Description")]
        public string Description { get; set; }
        [BsonElement("Indexes")]
        [BsonDictionaryOptions(DictionaryRepresentation.Document)]
        public Index Indexes { get; set; }
    }

Индекс.cs

public class Index : Dictionary<string, Dictionary<DateTime, double>> { }

Я также изменил сериализатор, чтобы вместо него трактовать DateTime как string, и включил это в запуск программы:

BsonSerializer.RegisterSerializer(new DateTimeSerializer(DateTimeKind.Local, BsonType.String));

Этиизменения позволяют правильно отформатировать структуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...