Десериализовать JSON и сохранить модель в Entity Framework - PullRequest
0 голосов
/ 04 июня 2019

У меня есть JSON-файл, который нужно десериализовать, используя два класса ниже: Car и Brand. Когда я загружаю файлы по отдельности, как мне привязать Car.Brand к бренду? Файл JSON включает Car.Brand как «Тесла», тогда как файл JSON Brand имеет имя Brand.Name как Тесла и идентификатор.

Как мне решить проблему с отображением?

public class Car
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Brand Brand { get; set; }
}
public class Brand
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Текущий код недостаточен:

List<Car> cars = new List<Car>();
using (StreamReader file = File.OpenText(@"cars.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    cars = (List<Car>)serializer.Deserialize(file, typeof(List<Car>));
}

car.json

[{
        "Id": 1,
        "Name": "Polo",
        "Brand": "Volkswagen"
    },
    {
        "Id": 2,
        "Name": "328",
        "Brand": "BMW"
    },
}]

brand.json

[{
        "Id": 8,
        "Name": "Volkswagen"
    },
    {
        "Id": 9,
        "Name": "BMW"
    }
}]

1 Ответ

0 голосов
/ 04 июня 2019

Вы можете написать собственный JsonConverter для десериализации автомобильного объекта, используя словарь брендов.

public class CustomCarConverter : JsonConverter<Car>
{
    Dictionary<string, Brand> _brands;

    public CustomCarConverter(Dictionary<string, Brand> brands)
    {
        _brands = brands;
    }

    public override bool CanWrite => false;
    public override void WriteJson(JsonWriter writer, Car value, JsonSerializer serializer) => throw new NotImplementedException();
    public override Car ReadJson(JsonReader reader, Type objectType, Car existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        JObject obj = (JObject)serializer.Deserialize(reader);

        return new Car()
        {
            Id = obj.GetValue("Id").Value<int>(),
            Name = obj.GetValue("Name").Value<string>(),
            Brand = _brands[obj.GetValue("Brand").Value<string>()]
        };
    }
}

десериализация вызова:

var brands = JsonConvert.DeserializeObject<List<Brand>>(brandsJSON);
var brandsByName = brands.ToDictionary(item => item.Name, item => item);
var cars = JsonConvert.DeserializeObject<List<Car>>(carsJSON, new CustomCarConverter(brandsByName));
//Save to DB

Кроме того, отправленные вами строки JSON недопустимы, так как имеют дополнительный }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...