json - JSON字符串数组到实体框架
问题描述
我正在尝试使用自动标识键和正确的外键关系将 JSON 文件放入 SQL Server 数据库中。除了字符串数组外,一切都运行良好。数据看起来或多或少是这样的:
{
"id" : "123",
"name" : "Some Stuff",
"phrase" : "More Stuff",
"type" : "ABC",
"label" : "Some label",
"responseType" : "The Response Type",
"answers" : [ "9" ]
}
“答案”部分让我感到不适。看起来它几乎完全是一个值,但它可能具有多个值,例如
"answers" : [ "6", "7", "8" ]
现在我知道 EF 中不支持对字符串或 int 等本机类型使用 List。无论如何,我最终宁愿为答案值列表提供一个单独的表,我称之为 DataAnswers。
public partial class Response
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ResponseId { get; set; }
[JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
public string Id { get; set; }
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
[JsonProperty("phrase", NullValueHandling = NullValueHandling.Ignore)]
public string Phrase { get; set; }
[JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
public string Type { get; set; }
[JsonProperty("label", NullValueHandling = NullValueHandling.Ignore)]
public string Label { get; set; }
[JsonProperty("responseType", NullValueHandling = NullValueHandling.Ignore)]
public string ResponseType { get; set; }
[JsonProperty("answers", NullValueHandling = NullValueHandling.Ignore)]
public virtual List<DataAnswer> DataAnswers { get; set; }
}
public partial class DataAnswer
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DataAnswerId { get; set; }
public string AnswerText { get; set; }
}
目前这是我遇到的错误。
Newtonsoft.Json.JsonSerializationException:“将值“9”转换为类型“ForeseeDemo.Data.DataAnswer”时出错。路径“items[0].responses[0].answers[0]”,第 60 行,位置 23。
关于如何将答案字符串列表放入带有 Response 外键的表中的任何好主意?
提前致谢!
解决方案
您可以创建一个数据传输对象,然后处理该转换和实体对象。
您可以创建一个自定义 JSON 转换器来处理属性的转换。
您可以创建一个用于序列化/反序列化但不是由 EF 使用的附加属性并在那里处理转换:
[JsonIgnore]
public virtual List<DataAnswer> DataAnswers { get; set; }
[NotMapped]
[JsonProperty( "answers", NullValueHandling = NullValueHandling.Ignore )]
public List<string> DataAnswerStrings
{
get => DataAnswers?.Select( da => da.AnswerText )?.ToList();
set => DataAnswers = value
?.Select( s => new DataAnswer() { AnswerText = s } )
?.ToList()
?? new List<DataAnswer>();
}
推荐阅读
- python - 如何在 Python 中为 Excel 创建新行?
- sql - TINYMCE 长度:asp.net mvc
- reporting-services - 如何在SSRS中计算组中的百分比
- javascript - 如何使用反应导航更新 stacknavigator 上的自定义标题?
- php - 添加模糊性时,Elasticsearch 返回一个奇怪的结果
- linux - shell if 语句执行,即使它不是真的
- node.js - 在柏树中找到或未找到 P 元素
- haskell - 类型的约束多态性
- python - Tkinter colorchooser 甚至无需导入即可运行
- wso2 - 试试这个用于招摇的 API 在 wso2 EI 6.4 中不起作用