【问题标题】:How to Deseriazile JSON and save to database using Entity Framework如何使用实体框架对 JSON 进行反序列化并保存到数据库
【发布时间】:2020-12-01 03:37:51
【问题描述】:

我从 API 中提取了一些 JSON 数据,现在我正尝试将其反序列化为一个对象并将这些对象保存到我使用实体框架创建的 SQL Server 数据库中。以下代码不允许我将数据添加到 Customers 表中,因为数据库不接受列表。

string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<List<Root>>(apiResponse);

db.Customers.AddRange(data);
db.SaveChanges();

以下代码也不起作用。我认为这可能与使用Customers 列表而不是&lt;Root&gt; 列表有关。但是我不想在我的数据库中创建一个Root 表,我宁愿只有一个Customers 的表而没有Root 表。

List<Customers> customers = new List<Customers>();

string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<Customers>(apiResponse);
customers.Add(data);

db.Customers.AddRange(data);
db.SaveChanges();

Json

[
  {
    "id": "1asda3",
    "name": "Customer1"
  },
  {
    "id": "asda2",
    "name": "Customer2"
  },
  {
    "id": "gfh234",
    "name": "Customer3"
  },
  {
    "id": "fdg312",
    "name": "Customer4"
  }
]

型号:

public class Root
{
    public List<Customers> Customers { get; set; }
}

public class Customers
{
    [JsonProperty("id")]
    public string id { get; set; }
    [JsonProperty("name")]
    public string name { get; set; }
}

数据库上下文:

public DbSet<Customers> Customers { get; set; }
public DbSet<Root> Root { get; set; }

编辑

我通过简单地从我的模型中删除公共类 Root 解决了我的问题。并通过使用:

string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<List<Customers>>(apiResponse);

db.Customers.AddRange(data);
db.SaveChanges();

【问题讨论】:

  • db.Customers.AddRange(JsonConvert.DeserializeObject&lt;List&lt;Customers&gt;&gt;(apiResponse)); ?
  • 请粘贴您收到的异常信息
  • 我认为您的意思是使用客户而不是数据,db.Customers.AddRange(&gt;&gt;customers&lt;&lt;)

标签: c# asp.net asp.net-mvc asp.net-core asp.net-web-api


【解决方案1】:

您有一个 json 对象,其中包含一个来自 API 的 json 数组,但您将其直接解析为 json 数组 我想这可能会失败

string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<Root>(apiResponse);

db.Customers.AddRange(data.Customers);
db.SaveChanges();

【讨论】:

  • 当我尝试这个解决方案时,我得到一个序列化错误:JsonSerializationException:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“FrontlineAI.Models.Root”,因为该类型需要正确反序列化的 JSON 对象(例如 {"name":"value"})。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如 List 可以从 JSON 数组反序列化。
猜你喜欢
  • 2017-12-10
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
相关资源
最近更新 更多