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

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

Через код:

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

(Использование JSON.Net)

Простейшим способом было бы JToken.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/ и создайте для него class шаблонов, а затем де-сериализуйте его с помощью JSON.Net.

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

JObject.Parse – может использоваться, чтобы проверить, является ли строка допустимым объектом Json
JArray.Parse – Может использоваться для проверки правильности строки Json Array
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! } 

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

 public static bool IsValidJson(this string strInput) { strInput = strInput.Trim(); if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array { try { var obj = JsonConvert.DeserializeObject(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; } } 
  • Порядок сериализованных полей с использованием JSON.NET
  • Как показать «вставить class Json» в visual studio 2012, нажав на «Специальная вставка»?
  • как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET
  • Как игнорировать неизвестные значения enum во время десериализации json?
  • JSON.net: как десериализовать без использования конструктора по умолчанию?
  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Ошибка десериализации Newtonsoft JSON.net, где поля в порядке изменения JSON
  • JSON.Net: принудительная сериализация всех частных полей и всех полей в подclassах
  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • Не удалось загрузить файл или сборку «Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed»
  • Как десериализовать объект JObject для .NET
  • Давайте будем гением компьютера.