C#/ MongoDB反序列化字典数组

问题描述 投票:1回答:1

我试图使用MongoDB在ASP.NET Core中创建一个字典数组数组。最后,数据应保留此模型用于所有用途:

模型

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

目前,我的第一层定义如下,包括ContextNameIndexes

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; }
    }

运行此代码我遇到格式异常说明

反序列化类Database.Index的IndexValues属性时发生错误:无效元素:'Date'。

我的第一个想法是,密钥是Date类型的问题,而不是数据库本身的string问题,但是我已经读过here towards the bottom,官方驱动程序实际上支持这个。

我进一步尝试设置一些自定义{ 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
                }
            }
        ]
    }

这是此输出唯一可行的选项吗?

c# mongodb asp.net-core
1个回答
0
投票

退后一步并查看数据结构后,我能够通过删除数组嵌套并仅使用文档嵌套(不幸但简化模式)来实现这一点。更新的数据库结构是:

[
    {
        "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; }
    }

Index.cs

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

我还改变了序列化器来将DateTime视为string,所以在程序启动时将其包括在内:

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

这些更改允许正确格式化结构。

© www.soinside.com 2019 - 2024. All rights reserved.