Как лучше всего получать значения JSON, которые могут даже не существовать в C #, с помощью Json.NET ?
Прямо сейчас я имею дело с поставщиком JSON, который возвращает JSON, который иногда содержит определенные пары ключ / значение, а иногда нет. Я использовал (возможно, неправильно) этот метод для получения своих значений (например, для получения двойника):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
Теперь это работает нормально, но когда их много, это громоздко. Я закончил тем, что написал метод расширения, и только после его написания я задался вопросом, не был ли я глуп ... в любом случае, вот метод расширения (я включаю только случаи для двойных и строковых, но на самом деле у меня довольно много Больше):
public static T GetValue<T>(this JToken jToken, string key,
T defaultValue = default(T))
{
T returnValue = defaultValue;
if (jToken[key] != null)
{
object data = null;
string sData = jToken[key].ToString();
Type type = typeof(T);
if (type is double)
data = double.Parse(sData);
else if (type is string)
data = sData;
if (null == data && type.IsValueType)
throw new ArgumentException("Cannot parse type \"" +
type.FullName + "\" from value \"" + sData + "\"");
returnValue = (T)Convert.ChangeType(data,
type, CultureInfo.InvariantCulture);
}
return returnValue;
}
А вот пример использования метода расширения:
width = jToken.GetValue<double>("width", 100);
Кстати, простите, что может быть действительно глупым вопросом, поскольку кажется, что для чего-то должна быть встроенная функция ... Я пробовал документацию Google и Json.NET , однако я либо неспособен найти решение для мой вопрос или в документации непонятно.
GetValue
нижеОтветы:
Это в значительной степени то, для чего предназначен общий метод
Value()
. Вы получите именно то поведение, которое хотите, если объедините его с типами значений, допускающими значение NULL, и??
оператором:источник
jToken
это такnull
, но вопрос не об этом. И вы можете легко исправить с помощью Нулевого условного оператора:width = jToken?.Value<double?>("width") ?? 100;
.JToken.Value<T>
выдает исключение, если JToken является JValueЯ бы написал
GetValue
как нижеТаким образом можно получить значение не только основных типов, но и сложных объектов. Вот образец
источник
retrieving JSON values that may not even exist
и все, что я предложил, это изменить вашGetValue
метод. Я думаю, это работает так, как вы хотитеВот как вы можете проверить, существует ли токен:
Он проверяет, существует ли «Items» в «Result».
Это НЕ рабочий пример, вызывающий исключение:
источник
Вы можете просто привести тип, и он выполнит преобразование за вас, например
Он автоматически вернется,
null
если указанный ключ отсутствует в объекте, поэтому нет необходимости проверять его.источник
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
например
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
источник
Это заботится о нулях
источник