C# — Newtonsoft.Json JProperty.Value<T>() не может вернуть значение указанного типа

109
12 августа 2019, 15:10

Есть JSON:

{
  "Table1": {
    "Field1": "abc",
    "Field2": "def"
  }
}

И есть код:

JObject data = JObject.Parse(myJson);
foreach (JProperty table in data.Properties())
{
    tables.Add(table.Name, new TableFields(table.Value<JObject>())); // <- тут ошибка
}

При выполнении кода выдает исключение InvalidCastException и говорит, что невозможно преобразовать значение в JObject. Почему так?

Пока что я прописал костыль JObject.Parse(table.Value.ToString()). Но далее я пытаюсь у полей со строками получить значения в формате String и опять получаю эту ошибку. Вот код:

public TableFields(JObject source)
{
    data = new Dictionary<string, string>();
    foreach (JProperty prop in source.Properties()) data.Add(prop.Name, prop.Value<String>());
}

Что это за бред такой? Тем более у этих JProperty в поле Type везде указаны именно те типы, к которым я пытаюсь привести: JObject в первом случае и String во втором.

Answer 1

Используемый вами метод Extensions.Value<T>(this IEnumerable<JToken> value) пытается преобразовать в указанный вами тип не значение свойства JProperty, а само свойство (пару из ключа и значения). Такая операция не имеет смысла, отсюда и ошибка.

Вместо этого следует использовать свойство JProperty.Value, чтобы получить именно значение свойства:

(JObject)table.Value
(string)prop.Value

Также можно использовать сначала свойство Value, а потом - метод:

table.Value.Value<JObject>()
prop.Value.Value<string>()
READ ALSO
Проблема при добавлении Framework сборок в SQL Server

Проблема при добавлении Framework сборок в SQL Server

Есть необходимость добавления CLR сборки в связке с самописной библиотекой классов (подключение к внешнему веб-сервису)При установке библиотеки...

136
Упрощение кода оператора if

Упрощение кода оператора if

Есть такой код на C#Можно ли его как-то упростить и привести к однострочному виду, т

96
Отключение иконки и клавиши Esc

Отключение иконки и клавиши Esc

Есть персонаж, который в сцене №3 берёт предмет «рычаг» (необходимый в сцене №1), на котором висит скрипт «LeverUpSave»

110