J'ai une corde brute. Je veux juste valider si la chaîne est JSON valide ou non. J'utilise JSON.NET.
Par code:
Votre meilleur pari est d'utiliser parse dans une try-catch
exception et catch en cas d'échec de l'analyse. (Je ne connais aucune TryParse
méthode) .
(Utilisation de JSON.Net)
Le moyen le plus simple serait d'utiliser Parse
la chaîne JToken.Parse
, et également de vérifier si la chaîne commence par {
ou [
et se termine par }
ou ]
respectivement (ajouté à partir de cette réponse ) :
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;
}
}
La raison pour laquelle ajouter des vérifications pour {
ou [
etc était basée sur le fait que JToken.Parse
l'analyse des valeurs telles que "1234"
ou "'a string'"
comme un jeton valide. L'autre option pourrait être d'utiliser à la fois JObject.Parse
et JArray.Parse
dans l' analyse syntaxique et voir si quelqu'un d'entre eux réussit, mais je crois que la vérification des {}
et []
devrait être plus facile. (Merci @RhinoDevel de l'avoir signalé )
Sans JSON.Net
Vous pouvez utiliser l' espace de noms .Net Framework 4.5 System.Json , 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 le gestionnaire de packages Nuget en utilisant la commande: PM> Install-Package System.Json -Version 4.0.20126.16343
sur la console du gestionnaire de packages) (pris à partir d' ici )
Manière non-code:
Habituellement, quand il y a une petite chaîne json et que vous essayez de trouver une erreur dans la chaîne json, je préfère personnellement utiliser les outils en ligne disponibles. Ce que je fais habituellement, c'est:
JToken.Parse("1234")
! Cela peut être une bonne idée de vérifier d'abord si la chaîne commence par[
ou{
. Une autre alternative est l'utilisationJObject.Parse()
etJArray.Parse()
.JToken.Parse("{a:1}")
ne lève pas d' exception même s'il s'agit d'un JSON invalide -a
doit être cité ( stackoverflow.com/q/949449/3116322 )Utilisez la
JContainer.Parse(str)
méthode pour vérifier si le str est un Json valide. Si cela lève une exception, ce n'est pas un Json valide.JObject.Parse
- Peut être utilisé pour vérifier si la chaîne est un objet Json valideJArray.Parse
- Peut être utilisé pour vérifier si la chaîne est un tableau Json valideJContainer.Parse
- Peut être utilisé pour vérifier à la fois l'objet Json et le tableaula source
JContainer.Parse("1234");
.En vous basant sur la réponse d'Habib, vous pouvez écrire une méthode d'extension:
Qui peut ensuite être utilisé comme ceci:
la source
JToken.Parse(s);
retournetrue
même siJToken.Parse(123);
true
pour cet invalideJSON
:{A:{"B": 1}}
Juste pour ajouter quelque chose à la réponse de @ Habib, vous pouvez également vérifier si le JSON donné est d'un type valide:
la source
J'ai trouvé que JToken.Parse analyse de manière incorrecte le JSON invalide tel que le suivant:
Collez la chaîne JSON dans http://jsonlint.com/ - elle n'est pas valide.
J'utilise donc:
la source
{ name : "l am invalid JSON" }
⚠️ Option alternative n'utilisant pas JSON.Net ⚠️
Pour .Net Core / .Net 5 ( en préversion au moment de la rédaction de cet article ), on peut également utiliser l'
System.Text.Json
espace de noms et analyser en utilisant leJsonDocument
. L'exemple est une méthode d'extension basée sur les opérations d'espace de noms:la source
Concernant la réponse de Tom Beech; J'ai plutôt proposé ce qui suit:
Avec une utilisation des éléments suivants:
la source
string
, mais cette réponse devrait vraiment soit a) ne pas être ici ou b) dire "j'ai utilisé la réponse de Tom Beech " sans lethis
, c'est-à-dire sans en faire un élément d'extension) - tant cette réponse que celle référencée ont une brièveté et des faiblesses identiques. Si vous devez faire valoir ce point, mettez simplement un commentaire sur l'autre réponse.JToken.Type
est disponible après une analyse réussie. Cela peut être utilisé pour éliminer une partie du préambule dans les réponses ci-dessus et fournir un aperçu pour un contrôle plus précis du résultat. Entrée totalement invalide (par exemple,"{----}".IsValidJson();
lancera toujours une exception).Référence Json.Net pour
JToken.Type
: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htmla source
Cette méthode ne nécessite pas de bibliothèques externes
la source
Voici une méthode d'extension TryParse basée sur la réponse de Habib:
Usage:
la source
J'utilise celui-ci:
la source