Как на счет этого ... Рекурсивный подход, так как ваши классы не совпадают с Cars / Make / Model, у вас есть Cars // Make / Model.
- Разобрать Json для JObject
- Создайте словарь для каждого Make , чтобы вы могли сохранять их отдельно через отдельный процесс
public static Dictionary<string, List<CarInfo>> GetCarInfo (JObject jObject)
{
Dictionary<string, List<CarInfo>> list = new Dictionary<string, List<CarInfo>>();
foreach (var property in jObject.Properties())
{
var thisProp = jObject[property.Name];
if (thisProp.Type.ToString().Equals("Array"))
list.Add(property.Name, JsonConvert.DeserializeObject<List<CarInfo>>(thisProp.ToString()));
else
GetCarInfo((JObject)jObject[property.Name]).ToList().ForEach(x => list.Add(x.Key, x.Value));
}
return list;
}
public static void SaveData(string key, List<CarInfo> value)
{
switch (key.ToUpper())
{
case "CRV":
// save it the CRV way
break;
case "COROLLA":
// save it this way
break;
default:
throw new ApplicationException("Unable to figure out which car it is..");
}
}
Использование в Main
var cars = JObject.Parse(json);
Dictionary<string, List<CarInfo>> carInfos = GetCarInfo((JObject)cars["Cars"]);
foreach (var carInfo in carInfos)
SaveData(carInfo.Key, carInfo.Value);
Примечание
Я заметил, что ваш объект json действительно не соответствует тому же стандарту. У вашего GM есть две материнские компании, когда у Honda и Toyota одна.
Предложение
Единственное, что я бы посоветовал, чтобы код выглядел и работал лучше, это обновить способ Вы звоните, чтобы обновить / добавить в БД. В настоящее время у вас есть один вызов для каждого типа, который определяет ваши циклы foreach. Если вы можете создать один обобщенный метод c для сохранения «CarInfo» с другим аргументом, который определяет «CRV» или «CORROLLA», это значительно упростит вам задачу.