Comment s'assurer que la chaîne est valide en utilisant JSON JSON.NET
j'ai une corde crue. Je veux juste valider si la chaîne est valide ou non JSON. J'utilise JSON.NET.
7 réponses
Par Code:
votre meilleur pari est d'utiliser parse à l'intérieur d'un try-catch
et exception de capture en cas de parsing échoué. (Je n'ai connaissance d'aucune méthode TryParse
) .
(Utilisation JSON.Net)
la manière la plus simple serait de Parse
la chaîne en utilisant JToken.Parse
, et aussi pour vérifier si la chaîne commence par {
ou [
et se termine par }
ou ]
respectivement (ajouté de cette réponse ) ) :
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;
}
}
la raison pour ajouter des vérifications pour {
ou [
etc était basée sur le fait que JToken.Parse
analyserait les valeurs telles que "1234"
ou "'a string'"
comme un jeton valide. L'autre option pourrait être d'utiliser les deux JObject.Parse
et JArray.Parse
dans parsing et voir si l'un d'eux réussit, mais je crois que vérifier pour {}
et []
devrait être plus facile. (Merci @RhinoDevel pour pointant )
Sans JSON.Net
vous pouvez utiliser .net framework 4.5 système.Json de l'espace de noms ,comme:
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());
}
(mais, vous devez installer System.Json
via Nuget package manager en utilisant la commande: PM> Install-Package System.Json -Version 4.0.20126.16343
sur la Console Package Manager) (tiré de ici )
Non codé:
habituellement, quand il y a une petite chaîne json et que vous essayez de trouver une erreur dans la chaîne json, alors je personnellement préfèrent utiliser les outils en ligne. Ce que je fais habituellement est:
- coller la chaîne JSON dans JSONLint le validateur JSON et voir si ses un JSON valide.
- copiez plus tard le JSON correct à http://json2csharp.com / et générer une classe template pour it et ensuite la désérialiser utilisation JSON.Net.
utiliser la méthode 151900920" pour vérifier si la DOD est valide. Si cela crée une exception, alors ce N'est pas un Json valide.
JObject.Parse
- Peut être utilisé pour vérifier si la chaîne de caractères est un objet Json valide
JArray.Parse
- Peut être utilisé pour vérifier si la chaîne est un Tableau Json valide
JContainer.Parse
- Peut être utilisé pour vérifier à la fois l'objet Json & Tableau
en S'appuyant sur la réponse D'Habib, vous pourriez écrire une méthode d'extension:
public static bool ValidateJSON(this string s)
{
try
{
JToken.Parse(s);
return true;
}
catch (JsonReaderException ex)
{
Trace.WriteLine(ex);
return false;
}
}
qui peut alors être utilisé comme ceci:
if(stringObject.ValidateJSON())
{
// Valid JSON!
}
juste pour ajouter quelque chose à la réponse de @Habib, vous pouvez également vérifier si donné JSON est d'un type valide:
public static bool IsValidJson<T>(this string strInput)
{
strInput = strInput.Trim();
if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
(strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
{
try
{
var obj = JsonConvert.DeserializeObject<T>(strInput);
return true;
}
catch // not valid
{
return false;
}
}
else
{
return false;
}
}
j'ai trouvé ce JToken.Analyser les traite de façon incorrecte invalid JSON comme suit:
{
"Id" : ,
"Status" : 2
}
coller la chaîne JSON dans http://jsonlint.com / - est invalide.
donc j'utilise:
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;
}
en ce qui concerne la réponse de Tom Beech; j'ai trouvé ce qui suit à la place:
public bool ValidateJSON(string s)
{
try
{
JToken.Parse(s);
return true;
}
catch (JsonReaderException ex)
{
Trace.WriteLine(ex);
return false;
}
}
avec l'usage de ce qui suit:
if (ValidateJSON(strMsg))
{
var newGroup = DeserializeGroup(strMsg);
}
cette méthode ne nécessite pas de bibliothèques externes
using System.Web.Script.Serialization;
bool IsValidJson(string json)
{
try {
var serializer = new JavaScriptSerializer();
dynamic result = serializer.DeserializeObject(json);
return true;
} catch { return false; }
}