Файлы содержат свойство, которое может выглядеть следующим образом:
Код: Выделить всё
"RECIPE": [{
"ctPoint_0": {
"endTemperature": 25,
"hours": 0.07999999821186066,
"startTemperature": 25
},
"ctPoint_1": {
"endTemperature": 30,
"hours": 0.07999999821186066,
"startTemperature": 25
},
"ctPoint_2": {
"endTemperature": 25,
"hours": 0.07999999821186066,
"startTemperature": 30
},
"pointCount": 3,
"type": "CyclicTemp"
}, {
"cycles": 2,
"type": "Repeat"
}, {
"cycles": 1,
"duration": {
"days": 0,
"hours": 0
},
}]
Код: Выделить всё
newProgram = JsonSerializer.Deserialize
(jsonString, options);
Код: Выделить всё
public class Program
{
public IList RECIPE { get; set; }
}
Код: Выделить всё
public struct Cyclic_Data
{
public float endTemperature { get; set; }
public float hours { get; set; }
public float startTemperature { get; set; }
}
public struct Recipe
{
public int cycles { get; set; }
// Would like to use this
public IList ctPoints { get; set; }
// this deserialises ok but obviously only to hardcoded limit
public Cyclic_Data ctPoint_0 { get; set; }
public Cyclic_Data ctPoint_1 { get; set; }
public Cyclic_Data ctPoint_2 { get; set; }
public Cyclic_Data ctPoint_3 { get; set; }
public Cyclic_Data ctPoint_4 { get; set; }
public Cyclic_Data ctPoint_5 { get; set; }
public Cyclic_Data ctPoint_6 { get; set; }
public Cyclic_Data ctPoint_7 { get; set; }
public Cyclic_Data ctPoint_8 { get; set; }
public Cyclic_Data ctPoint_9 { get; set; }
public Cyclic_Data ctPoint_10 { get; set; }
public Duration duration { get; set;}
public string type { get; set; }
public float temperature { get; set; }
public int pointCount { get; set; }
}
Мне бы очень хотелось использовать IList для чтения всех значений ctPoint_X, но я изо всех сил пытаюсь найти способ сделать это. Вместо этого я рассматривал мягкую реализацию Newton и задавался вопросом, можно ли использовать [JsonProperty("name")] с RegEx для решения этой проблемы, но не смог найти ни одного успешного примера, выполненного таким образом.
Как я могу десериализовать это разумным образом?
EDIT:
В настоящее время я рассматриваю пользовательскую политику JsonNamingPolicy для переименования любого имени свойства, соответствующего RegEx "^ctPoint_[0-9]+$", в ctPoints, сообщу, если это удастся, прокомментируйте, если это обречено на неудачу или есть ли лучший вариант способ..
РЕДАКТИРОВАТЬ 2:
Я попробовал метод, описанный выше, но он не сработал, поскольку правильный JSON для списка элементов не имеет имени в начале каждого элемента, однако это заставило меня задуматься о проблеме по-другому. В итоге я сделал несколько простых замен строк перед десериализацией. Это сработало нормально
Код: Выделить всё
int location;
location = newText.IndexOf("\"ctPoint_0\":");
newText = newText.Replace("\"ctPoint_0\":", "\"ctPoints\": [");
if (location > 0)
{ int lastloc;
for (int i = 1; i < 999999; i++)
{
string nextString = "\"ctPoint_" + i.ToString() + "\": ";
lastloc = location;
location = newText.IndexOf(nextString);
newText = newText.Replace(nextString, "");
if (location == -1)
{
location = newText.IndexOf("}", lastloc);
newText = newText.Insert(location+1, "]");
break;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/601 ... perty-name
Мобильная версия