Come assicurarsi che la stringa sia JSON valida usando JSON.NET

Ho una stringa grezza. Voglio solo verificare se la stringa è JSON valida o meno. Sto usando JSON.NET.

Attraverso il codice:

La soluzione migliore è usare parse all’interno di un try-catch e rilevare l’eccezione in caso di parsing fallito. (Non sono a conoscenza di alcun metodo TryParse ) .

(Utilizzando JSON.Net)

Il modo più semplice sarebbe quello di JToken.Parse la stringa usando JToken.Parse , e anche di verificare se la stringa inizia con { oppure [ e termina con } o ] rispettivamente (aggiunto da questa risposta ) :

 private static bool IsValidJson(string strInput) { 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; } } 

Il motivo per aggiungere assegni per { o [ etc era basato sul fatto che JToken.Parse avrebbe analizzato i valori come "1234" o "'a string'" come token valido. L’altra opzione potrebbe essere quella di utilizzare sia JObject.Parse che JObject.Parse JArray.Parse e vedere se qualcuno di essi ha JArray.Parse positivo, ma credo che il controllo di {} e [] dovrebbe essere più semplice. (Grazie a @RhinoDevel per averlo indicato)

Senza JSON.Net

Puoi utilizzare .Net framework 4.5 System.Json namespace , come:

 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()); } 

(Tuttavia, è necessario installare System.Json tramite il gestore pacchetti Nuget utilizzando il comando: PM> Install-Package System.Json -Version 4.0.20126.16343 sulla console di Gestione pacchetti) (tratto da qui )

Modo non codice:

Di solito, quando c’è una piccola stringa json e stai cercando di trovare un errore nella stringa json, allora personalmente preferisco usare gli strumenti disponibili online. Quello che faccio di solito è:

  • Incolla la stringa JSON in JSONLint JSON Validator e verifica se è un JSON valido.
  • Successivamente, copia il JSON corretto su http://json2csharp.com/ e genera una class template per esso e quindi deserializza usando JSON.Net.

Utilizzare il JContainer.Parse(str) per verificare se lo str è un Json valido. Se questo genera un’eccezione, allora non è un Json valido.

JObject.Parse – Può essere usato per verificare se la stringa è un object Json valido
JArray.Parse – Può essere usato per verificare se la stringa è una matrice Json valida
JContainer.Parse : può essere utilizzato per controllare sia l’object JSON che la matrice

Basandosi sulla risposta di Habib, potresti scrivere un metodo di estensione:

 public static bool ValidateJSON(this string s) { try { JToken.Parse(s); return true; } catch (JsonReaderException ex) { Trace.WriteLine(ex); return false; } } 

Quale può quindi essere usato in questo modo:

 if(stringObject.ValidateJSON()) { // Valid JSON! } 

Solo per aggiungere qualcosa alla risposta di @ Habib, puoi anche controllare se il JSON dato proviene da un tipo valido:

 public static bool IsValidJson(this string strInput) { strInput = strInput.Trim(); if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array { try { var obj = JsonConvert.DeserializeObject(strInput); return true; } catch // not valid { return false; } } else { return false; } } 

Ho trovato che JToken.Parse analizza erroneamente JSON non valido come il seguente:

 { "Id" : , "Status" : 2 } 

Incolla la stringa JSON in http://jsonlint.com/ – non è valida.

Quindi io uso:

  public static bool IsValidJson(this string input) { input = input.Trim(); if ((input.StartsWith("{") && input.EndsWith("}")) || //For object (input.StartsWith("[") && input.EndsWith("]"))) //For array { try { //parse the input into a JObject var jObject = JObject.Parse(input); foreach(var jo in jObject) { string name = jo.Key; JToken value = jo.Value; //if the element has a missing value, it will be Undefined - this is invalid if (value.Type == JTokenType.Undefined) { return false; } } } 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; } return true; } 

Per quanto riguarda la risposta di Tom Beech; Ho trovato il seguente invece:

 public bool ValidateJSON(string s) { try { JToken.Parse(s); return true; } catch (JsonReaderException ex) { Trace.WriteLine(ex); return false; } } 

Con l’uso di quanto segue:

 if (ValidateJSON(strMsg)) { var newGroup = DeserializeGroup(strMsg); } 

Questo metodo non richiede librerie esterne

 using System.Web.Script.Serialization; bool IsValidJson(string json) { try { var serializer = new JavaScriptSerializer(); dynamic result = serializer.DeserializeObject(json); return true; } catch { return false; } }