Как убедиться, что строка является допустимым JSON с использованием JSON.NET


У меня есть "сырые" строки. Я просто хочу проверить, является ли строка допустимой JSON или нет. Я использую JSON.NET.

7 87

7 ответов:

Через Код:

лучше всего использовать разбор внутри try-catch и поймать исключение в случае неудачного разбора. (я не знаю ни одного TryParse способ).

(Используя JSON.Net)

самым простым способом было бы Parse строка JToken.Parse, а также проверить, если строка начинается с { или [ и заканчивается } или ] соответственно (добавлено из этого ответ):

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

причина добавления чеков для { или [ etc был основан на том, что JToken.Parse будет анализировать значения, такие как "1234" или "'a string'" как допустимый токен. Другой вариант может быть использовать оба JObject.Parse и JArray.Parse в разборе и посмотреть, если кто-то из них преуспевает, но я считаю, что проверка {} и [] должно быть легче.(спасибо @RhinoDevel за указывать it out)

Без JSON.Net

вы можете использовать .Net framework 4.5

использовать JContainer.Parse(str) метод, чтобы проверить, является ли str допустимым Json. Если это вызывает исключение, то это не является допустимым Json.

JObject.Parse - можно использовать, чтобы проверить, является ли строка допустимым объектом Json
JArray.Parse - можно использовать, чтобы проверить, является ли строка допустимым массивом Json
JContainer.Parse - может использоваться для проверки как объекта Json, так и массива

основываясь на ответе Хабиба, вы можете написать метод расширения:

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

, который затем может быть использован такой:

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

просто чтобы добавить что-то к ответу @Habib, вы также можете проверить, является ли данный JSON допустимым типом:

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

Я нашел, что JToken.Parse неправильно анализирует недопустимый JSON, например:

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

вставьте строку JSON в http://jsonlint.com/ - это недопустимо.

Я:

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

Что касается ответа Тома Бука; вместо этого я придумал следующее:

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

С использованием следующего:

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

этот метод не требует внешних библиотек

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