#c# #asp.net #asp.net-mvc #asp.net-core #asp.net-web-api
#c# #asp.net #asp.net-mvc #asp.net-ядро #asp.net-веб-api
Вопрос:
Я извлек некоторые данные JSON из API, и теперь я пытаюсь десериализовать их в объект и сохранить эти объекты в моей базе данных SQL Server, которая была создана с использованием Entity Framework. Следующий фрагмент кода не позволит мне добавить данные в Customers
таблицу, потому что база данных не принимает список.
string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<List<Root>>(apiResponse);
db.Customers.AddRange(data);
db.SaveChanges();
Также следующий код не будет работать. Я думаю, это может иметь какое-то отношение к использованию списка Customers
, а не списка <Root>
. Но я не хочу создавать 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; }
}
DbContext:
public DbSet<Customers> Customers { get; set; }
public DbSet<Root> Root { get; set; }
Редактировать
Я решил свою проблему, просто удалив корень общедоступного класса из моей модели. И с помощью:
string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<List<Customers>>(apiResponse);
db.Customers.AddRange(data);
db.SaveChanges();
Комментарии:
1.
db.Customers.AddRange(JsonConvert.DeserializeObject<List<Customers>>(apiResponse));
?2. Пожалуйста, вставьте полученное вами сообщение об исключении
3. Я думаю, вы имели в виду использовать клиентов вместо данных,
db.Customers.AddRange(>>customers<<)
Ответ №1:
у вас есть объект json, содержащий массив json, поступающий из API, но вы анализируете его напрямую в массив json, я думаю, это может быть
string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<Root>(apiResponse);
db.Customers.AddRange(data.Customers);
db.SaveChanges();
Комментарии:
1. Когда я пытаюсь это решение, я получаю ошибку сериализации: Исключение JsonSerializationException: не удается десериализовать текущий массив JSON (например, [1,2,3] ) в тип ‘FrontlineAI.Models. Root’ потому что для правильного десериализации типа требуется объект JSON (например, {«name»:»value»} ). Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {«name»:»value»}), либо измените десериализованный тип на array или тип, который реализует интерфейс сбора (например, ICollection, IList), подобный List<T>, который может быть десериализован из массива JSON.