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.

87
demandé sur wonea 2013-02-20 14:42:37

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:

129
répondu Habib 2017-05-23 10:31:26

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

23
répondu Senthilkumar Viswanathan 2018-01-10 15:49:17

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!
}
7
répondu Tom Beech 2015-07-14 10:38:50

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;
    }
}
5
répondu Jalal 2017-01-02 13:28:53

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;
        }
4
répondu Andrew Roberts 2016-04-26 06:38:41

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);
}
3
répondu HappyCoding 2017-08-07 09:38:10

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; }
    }
1
répondu MostafaZ4 2017-09-07 17:42:33