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

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

Ответ 1

Через код:

Лучше всего использовать синтаксический анализ внутри try-catch и исключение 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;
    }
}

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

Без JSON.Net

Вы можете использовать .Net framework 4.5 пространство имен System.Json, например:

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

(Но вам нужно установить System.Json через диспетчер пакетов Nuget, используя команду: PM> Install-Package System.Json -Version 4.0.20126.16343 в консоли диспетчера пакетов) (взято из здесь)

Некодовый способ:

Обычно, когда есть маленькая строка json, и вы пытаетесь найти ошибку в строке json, я лично предпочитаю использовать доступные он-лайн инструменты. Обычно я делаю следующее:

  • Вставить строку JSON в JSONLint JSON Validator и посмотреть, его действительный JSON.
  • Затем скопируйте правильный JSON в http://json2csharp.com/ и сгенерировать для него шаблонный класс, а затем де-сериализовать его используя JSON.Net.

Ответ 2

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

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

Ответ 3

На основе ответа Habib вы можете написать метод расширения:

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

Ответ 4

Просто чтобы добавить что-то в ответ @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;
    }
}

Ответ 5

Я обнаружил, что 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;
        }

Ответ 6

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

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

Ответ 7

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

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