Десериализовать JSON в C#, используя system.text.json со сложным именем свойства.C#

Место общения программистов C#
Ответить
Anonymous
 Десериализовать JSON в C#, используя system.text.json со сложным именем свойства.

Сообщение Anonymous »

Я пытаюсь десериализовать файлы JSON, созданные с помощью стороннего инструмента.

Файлы содержат свойство, которое может выглядеть следующим образом:

Код: Выделить всё

"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
},

}]
Для десериализации я использую system.text.json:

Код: Выделить всё

newProgram = JsonSerializer.Deserialize
(jsonString, options);
Отрывок из моего класса программы:

Код: Выделить всё

public class Program
{

public IList RECIPE { get; set; }
}
Рецепт и структура cycl_data:

Код: Выделить всё

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; }

}
Согласно комментариям, если у меня есть несколько дискретных переменных типа Cyclic_Data, например. ctPoint_0, то это успешно десериализуется, однако, поскольку этот список теоретически может быть сколь угодно большим, было бы бессмысленно пытаться объявить все возможные имена свойств.

Мне бы очень хотелось использовать 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»