Apa praktik terbaik untuk mengambil nilai JSON yang bahkan mungkin tidak ada di C # menggunakan Json.NET ?
Saat ini saya berurusan dengan penyedia JSON yang mengembalikan JSON yang terkadang berisi pasangan kunci / nilai tertentu, dan terkadang tidak. Saya telah menggunakan (mungkin salah) metode ini untuk mendapatkan nilai saya (contoh untuk mendapatkan ganda):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
Sekarang itu berfungsi dengan baik, tetapi jika ada banyak, itu tidak praktis. Saya akhirnya menulis metode ekstensi, dan hanya setelah menulisnya saya bertanya-tanya apakah mungkin saya bodoh ... bagaimanapun, berikut adalah metode ekstensi (saya hanya menyertakan kasus untuk double dan string, tetapi pada kenyataannya saya memiliki beberapa lebih):
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;
}
Dan inilah contoh penggunaan metode ekstensi:
width = jToken.GetValue<double>("width", 100);
BTW, Maafkan apa yang mungkin merupakan pertanyaan yang sangat bodoh, karena sepertinya ada sesuatu yang harus ada fungsi bawaan untuk ... Saya memang mencoba Google, dan dokumentasi Json.NET , namun saya tidak kompeten dalam menemukan solusi untuk pertanyaan saya atau tidak jelas dalam dokumentasi.
GetValue
bawah iniJawaban:
Ini cukup banyak untuk apa metode generik
Value()
. Anda mendapatkan perilaku yang Anda inginkan jika menggabungkannya dengan tipe nilai nullable dan??
operator:sumber
jToken
memang demikiannull
, tapi bukan itu pertanyaan yang diajukan. Dan Anda dapat dengan mudah memperbaikinya dengan menggunakan nol operator kondisional:width = jToken?.Value<double?>("width") ?? 100;
.JToken.Value<T>
melempar pengecualian jika JToken adalah JValueSaya akan menulis
GetValue
seperti di bawah iniDengan cara ini Anda bisa mendapatkan nilai tidak hanya tipe dasar tetapi juga objek kompleks. Berikut ini contohnya
sumber
retrieving JSON values that may not even exist
dan semua yang saya usulkan adalah mengubahGetValue
metode Anda . Saya pikir ini berfungsi seperti yang Anda inginkanInilah cara Anda dapat memeriksa apakah token itu ada:
Ia memeriksa apakah "Item" ada di "Hasil".
Ini adalah contoh yang TIDAK berfungsi yang menyebabkan pengecualian:
sumber
Anda cukup mengetik, dan itu akan melakukan konversi untuk Anda, misalnya
Ini akan secara otomatis kembali
null
jika kunci tersebut tidak ada dalam objek, jadi tidak perlu mengujinya.sumber
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
misalnya
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
sumber
Ini menangani nulls
sumber