Jaka jest najlepsza praktyka pobierania wartości JSON, które mogą nawet nie istnieć w języku C # przy użyciu Json.NET ?
W tej chwili mam do czynienia z dostawcą JSON, który zwraca JSON, który czasami zawiera pewne pary klucz / wartość, a czasami nie. Używałem (być może niepoprawnie) tej metody, aby uzyskać moje wartości (przykład dla uzyskania podwójnego):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
Teraz to działa dobrze, ale gdy jest ich dużo, jest to kłopotliwe. Skończyło się na napisaniu metody rozszerzającej i dopiero po jej napisaniu zastanawiałem się, czy może nie byłem głupi ... tak czy inaczej, oto metoda rozszerzająca (uwzględniam tylko przypadki dla double i string, ale w rzeczywistości mam sporo więcej):
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;
}
A oto przykład użycia metody rozszerzenia:
width = jToken.GetValue<double>("width", 100);
Swoją drogą , proszę wybaczyć to, co może być naprawdę głupie pytanie, bo wygląda na to, że coś powinno mieć wbudowaną funkcję dla ... Wypróbowałem Google i dokumentację Json.NET , ale nie jestem w stanie znaleźć rozwiązania moje pytanie lub nie jest to jasne w dokumentacji.
GetValue
poniżejOdpowiedzi:
Do tego właśnie służy metoda ogólna
Value()
. Otrzymasz dokładnie takie zachowanie, jakie chcesz, jeśli połączysz je z typami wartości dopuszczalnej wartości null i??
operatorem:źródło
jToken
taknull
, ale nie o to zadawano pytanie. I można łatwo naprawić za pomocą zerowej operator warunkowy:width = jToken?.Value<double?>("width") ?? 100;
.JToken.Value<T>
zgłasza wyjątek, jeśli JToken jest wartością JValueNapisałbym
GetValue
jak poniżejW ten sposób można uzyskać wartość nie tylko podstawowych typów, ale także złożonych obiektów. Oto próbka
źródło
retrieving JSON values that may not even exist
i zaproponowałem tylko zmianęGetValue
metody. Myślę, że działa tak, jak chceszOto jak możesz sprawdzić, czy token istnieje:
Sprawdza, czy „Elementy” istnieją w „Wynikach”.
To jest NIE działający przykład, który powoduje wyjątek:
źródło
Możesz po prostu typecast, a on dokona konwersji za Ciebie, np
Automatycznie zwróci,
null
jeśli ten klucz nie jest obecny w obiekcie, więc nie ma potrzeby testowania go.źródło
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
na przykład
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
źródło
To zajmuje się zerami
źródło