反序列化JSON并将模型保存在实体框架中

时间:2019-06-03 23:51:03

标签: c# entity-framework json.net

我有一个JSON文件,需要使用以下两个类将其反序列化:Car和Brand。当我分别加载文件时,如何将Car.Brand映射到Brand? JSON文件包含Car.Brand作为“ Tesla”,而JSON文件Brand具有Brand.Name作为Tesla和ID。

如何解决映射问题?

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 :(得分:0)

您可以编写自定义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字符串无效,因为它们具有附加的}