我有一个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"
}
}]
答案 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字符串无效,因为它们具有附加的}
。