将 [BsonExtraElements] 展平为键值对 json 输出

Flatten [BsonExtraElements] to key value pair json output

我在 c# 中使用 [BsonExtraElements] 来捕获无法映射到我的 class 的额外数据。

public class QuestionAnswerClass
{
    public string Name { get;set;}
  
    [BsonExtraElements]
    public Dictionary<string,object> AdditionalData {get; set;}
}

示例数据存储在mongodb

{
 Name: John
 Question1: Answer1
 Question2: Answer2
},
{
 Name: Mary
 Question3: Answer3
 Question4: Answer4
}
 

在我的控制器中,我获取数据 mongoDB,将其反序列化为我的 QuestionAnswerClass 并 return 输出为 JsonResult。

var client = new MongoClient("Credentials here");
var database = client.GetDatabase("db");

var results = database.GetCollection<QuestionAnswerClass>("QuestionAnswers").AsQueryable().ToList();
return new JsonResult(results);

Json输出如下

[
 {
  Name: John
  AdditionalData: {
    Question1: Answer1,
    Question2: Answer2
  }, 
 {
  Name: Mary
  AdditionalData: {
    Question3: Answer3,
    Question4: Answer4
  },
 }
]

问题:如何将 AdditionalData 的输出展平为它自己的键值对。我想要的示例输出如下

[
 {
  Name: John,
  Question1: Answer1,
  Question2: Answer2
 }, 
 {
  Name: Mary,
  Question3: Answer3,
  Question4: Answer4 
 }
]

System.Text.Json(以及 JSON.NET 供任何人阅读)支持名为 [JsonExtensionData].

的属性

您可以在您的模型中这样声明它:

[JsonExtensionData]
public Dictionary<string, object> ExtensionData { get; set; }

并且它将字典 key/values 序列化为父对象中的属性。因此,如果我们获取您的对象并添加此属性:

public class QuestionAnswerClass
{
    public string Name { get;set;}
  
    [JsonExtensionData]
    [BsonExtraElements]
    public Dictionary<string,object> AdditionalData {get; set;}
}

我们将得到预期的输出:

[
  {
    "Name": "John",
    "Question1": "Answer1",
    "Question2": "Answer2"
  },
  {
    "Name": "Mary",
    "Question3": "Answer3",
    "Question4": "Answer4"
  }
]

Try it online