Saya punya string mentah. Saya hanya ingin memvalidasi apakah string itu JSON valid atau tidak. Saya menggunakan JSON.NET.
Melalui Kode:
Taruhan terbaik Anda adalah menggunakan parse di dalam a try-catch
dan menangkap pengecualian jika parsing gagal. (Saya tidak mengetahui TryParse
metode apa pun ) .
(Menggunakan JSON.Net)
Cara paling sederhana adalah Parse
menggunakan string JToken.Parse
, dan juga untuk memeriksa apakah string dimulai dengan {
atau [
dan diakhiri dengan }
atau ]
masing - masing (ditambahkan dari jawaban ini ) :
private static bool IsValidJson(string strInput)
{
if (string.IsNullOrWhiteSpace(stringValue)) { return false;}
strInput = strInput.Trim();
if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
(strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
{
try
{
var obj = JToken.Parse(strInput);
return true;
}
catch (JsonReaderException jex)
{
//Exception in parsing json
Console.WriteLine(jex.Message);
return false;
}
catch (Exception ex) //some other exception
{
Console.WriteLine(ex.ToString());
return false;
}
}
else
{
return false;
}
}
Alasan untuk menambahkan cek untuk {
atau [
lain-lain didasarkan pada fakta yang JToken.Parse
akan menguraikan nilai-nilai seperti "1234"
atau "'a string'"
sebagai token yang valid. Pilihan lain bisa menggunakan keduanya JObject.Parse
dan JArray.Parse
di parsing dan melihat apakah ada di antara mereka yang berhasil, tapi saya percaya memeriksa {}
dan []
harus lebih mudah. (Terima kasih @RhinoDevel karena menunjukkannya )
Tanpa JSON.Net
Anda dapat memanfaatkan .Net framework 4.5 System.Json namespace , seperti:
string jsonString = "someString";
try
{
var tmpObj = JsonValue.Parse(jsonString);
}
catch (FormatException fex)
{
//Invalid json format
Console.WriteLine(fex);
}
catch (Exception ex) //some other exception
{
Console.WriteLine(ex.ToString());
}
(Tapi, Anda harus menginstal System.Json
melalui manajer paket Nuget menggunakan perintah: PM> Install-Package System.Json -Version 4.0.20126.16343
pada Package Manager Console) (diambil dari sini )
Cara Non-Kode:
Biasanya, ketika ada string json kecil dan Anda mencoba untuk menemukan kesalahan dalam string json, maka saya pribadi lebih suka menggunakan alat online yang tersedia. Apa yang biasanya saya lakukan adalah:
JToken.Parse("1234")
! Sebaiknya periksa dulu, apakah string dimulai dengan[
atau{
. Alternatif lain adalah penggunaanJObject.Parse()
danJArray.Parse()
.JToken.Parse("{a:1}")
tidak tidak membuang pengecualian meskipun ini adalah JSON tidak valid -a
harus dikutip ( stackoverflow.com/q/949449/3116322 )Gunakan
JContainer.Parse(str)
metode untuk memeriksa apakah str adalah Json yang valid. Jika ini melempar pengecualian maka itu bukan Json yang valid.JObject.Parse
- Dapat digunakan untuk memeriksa apakah string adalah objek Json yang validJArray.Parse
- Dapat digunakan untuk memeriksa apakah string tersebut merupakan Json Array yang validJContainer.Parse
- Dapat digunakan untuk memeriksa kedua objek Json & Arraysumber
JContainer.Parse("1234");
.Berdasarkan jawaban Habib, Anda dapat menulis metode ekstensi:
Yang kemudian bisa digunakan seperti ini:
sumber
JToken.Parse(s);
kembalitrue
bahkan jikaJToken.Parse(123);
true
untuk yang tidak valid iniJSON
:{A:{"B": 1}}
Hanya untuk menambahkan sesuatu ke jawaban @ Habib, Anda juga dapat memeriksa apakah JSON yang diberikan adalah dari tipe yang valid:
sumber
Saya menemukan bahwa JToken.Parse salah mem-parsing JSON yang tidak valid seperti berikut ini:
Rekatkan string JSON ke http://jsonlint.com/ - tidak valid.
Jadi saya menggunakan:
sumber
{ name : "l am invalid JSON" }
⚠️ Opsi Alternatif Tidak Menggunakan JSON.Net ⚠️
Untuk .Net Core / .Net 5 ( dalam pratinjau saat tulisan ini dibuat ) seseorang juga dapat menggunakan
System.Text.Json
namespace dan parse menggunakanJsonDocument
. Contoh adalah metode ekstensi berdasarkan operasi namespace:sumber
Mengenai jawaban Tom Beech; Saya datang dengan yang berikut ini sebagai gantinya:
Dengan penggunaan berikut ini:
sumber
string
, tetapi jawaban ini benar-benar harus a) tidak berada di sini atau b) mengatakan "Saya menggunakan jawaban Tom Beech " tanpa thethis
, yaitu tanpa menjadikannya anggota ekstensi) - baik jawaban ini maupun yang direferensikan memiliki keringkasan dan kelemahan yang identik. Jika Anda harus membuat poin ini, cukup beri komentar pada jawaban lainnya.JToken.Type
tersedia setelah penguraian yang sukses. Ini dapat digunakan untuk menghilangkan beberapa mukadimah dalam jawaban di atas dan memberikan wawasan untuk kontrol hasil yang lebih baik. Masukan yang sepenuhnya tidak valid (mis."{----}".IsValidJson();
Masih akan memberikan pengecualian).Referensi Json.Net untuk
JToken.Type
: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htmsumber
Metode ini tidak memerlukan perpustakaan eksternal
sumber
Berikut adalah metode ekstensi TryParse berdasarkan jawaban Habib:
Pemakaian:
sumber
Saya menggunakan ini:
sumber