gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:24 26 4
gpt4 key购买 nike

我正在尝试使用 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:

上下文.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; }
}

运行这段代码我遇到了格式异常说明

An error occurred while deserializing the IndexValues property of class Database.Index: Invalid element: 'Date'.'

我的第一个想法是,这是一个问题,因为键是 Date 类型,而不是数据库本身的 string 类型,但是我已经阅读了 here towards the bottom官方驱动确实支持这个。

我进一步尝试设置一些自定义 { get;放; } 将 key 作为字符串引入,但最终遇到了同样的错误。

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

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

最佳答案

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

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

将类结构更新为:

上下文.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));

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

关于C#/MongoDB反序列化字典数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55339596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com