Я сериализую список Интерфейсов в файл JSON, который я десериализирую позже.
В одном приложении я десериализирую все типы объектов JSON, но в другом приложении я хочу десериализовать только одну конкретную реализацию интерфейса (Machine1) . Я хочу сохранить способ сериализации данных как есть, но измените код десериализации на SKIP для любого из неправильных объектов (объектов JSON другого типа, чем я заинтересован) - я планировал сделать это, проверив, Переменная-член отсутствует (если powerWatts отсутствует, то данные должны представлять Machine2, поэтому мы должны пропустить десериализацию этого конкретного объекта (Machine2) и вместо этого десериализовать остальные в массиве). Как бы я реализовать это с помощью JSON.Net? MissingMemberHandling.Error генерирует исключение, поэтому я не думаю, что сработает для десериализации остальной части списка после просмотра отсутствующего свойства. MissingMemberHandling.Ignore оставляет мне свойство, равное 0, что неверно.
Интерфейс и классы:
public interface IMachineInfo
{
DateTime windowsTime { get; set; }
DateTime irigTime { get; set; }
string messageTypeFlag { get; }
byte? sequenceNum { get; }
}
public class Machine1 : IMachineInfo
{
// Interface properties omitted for brevity
public double powerWatts { get; set; }
public double radiation { get; set; }
public double current { get; set; }
}
public class Machine2 : IMachineInfo
{
public double dbm { get; set; }
public double magneticField { get; set; }
public double frequency { get; set; }
}
Основной:
// Serialization: get the interface and specific data into a collection that will be written to a file
IMachineInfo decoded = data[key].MachineDataDecoded;
dataConverted[key] = decoded;
//... more code
//write JSON data to JSONData.txt
string jsondata = JsonConvert.SerializeObject(dataConverted.Values.ToArray(), Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
File.AppendAllText(Environment.CurrentDirectory + subDirectoryName + jsonFileName, jsondata);
App2 (десериализация данных)
// try to read the json, but I only want Machine1 data, skip anything in the json that is related to machine2
JsonSerializerSettings settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
List<Machine1> ampData = JsonConvert.DeserializeObject<List<Machine1>>(@"C/Path/jsonfile", settings);
Реальные данные JSON:
[
{
"windowsTime": "2019-01-14T18:47:55.8390256-06:00",
"irigTime": "0001-01-01T00:00:00",
"messageTypeFlag": "Q",
"sequenceNum": 0,
},
{
"dbm": "66",
"magneticField ": "8967",
"frequency": "34500",
"windowsTime": "2019-01-14T18:47:55.8390256-06:00",
"irigTime": "0001-01-01T00:00:00",
"messageTypeFlag": "Q",
"sequenceNum": 0,
},
{
"powerWatts": "4000",
"radiation": "67",
"current": "2478",
"windowsTime": "2019-01-14T18:47:55.8390256-06:00",
"irigTime": "0001-01-01T00:00:00",
"messageTypeFlag": "Q",
"sequenceNum": 0,
},
{
"powerWatts": "4000",
"radiation": "67",
"current": "2478",
"windowsTime": "2019-01-14T18:47:55.8390258-06:00",
"irigTime": "0001-01-01T00:00:00",
"messageTypeFlag": "Q",
"sequenceNum": 0,
}
]
в моих данных выше только 3-й и 4-й элемент имеют тип Machine1, поэтому я хочу, чтобы эти объекты были добавлены в список только из десериализации json. Проблема в том, что когда я сейчас десериализую это, powerWatts = 0
для всех 4 элементов (не то поведение, которое я хочу) , хотя это только допустимое свойство 3-го и 4-го элемента. Это проблема, так как я не могу просто проверить, если powerWatts == 0
и удалить его из моего списка, так как 0 может быть допустимым значением в реальной ситуации. Мне нужно только десериализовать объекты Machine1 JSON