У меня есть сырая строка. Я просто хочу проверить, является ли строка допустимым JSON или нет. Я использую JSON.NET.
Через код:
Лучше всего использовать синтаксический анализ внутри a try-catch
и перехватить исключение в случае неудачного анализа. (Я не знаю ни одного TryParse
метода) .
(Используя JSON.Net)
Простейшим способом было бы Parse
использовать строку JToken.Parse
, а также проверить, начинается ли строка с {
или [
и заканчивается ли }
или ]
соответственно (добавлено из этого ответа ) :
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;
}
}
Причина добавления проверок для {
и [
т. Д. Была основана на том факте, что они 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, я лично предпочитаю использовать доступные инструменты онлайн. Что я обычно делаю, это:
JToken.Parse("1234")
! Хорошей идеей будет сначала проверить, начинается ли строка с[
или{
. Другой альтернативой является использованиеJObject.Parse()
иJArray.Parse()
.JToken.Parse("{a:1}")
никак не кидать исключение , даже если это является недопустимым JSON -a
должны быть указаны ( stackoverflow.com/q/949449/3116322 )использование
JContainer.Parse(str)
метод, чтобы проверить, является ли str действительным Json. Если это вызывает исключение, то это не правильный Json.JObject.Parse
- Может использоваться для проверки, является ли строка допустимым объектом JsonJArray.Parse
- Может использоваться для проверки, является ли строка допустимым массивом JsonJContainer.Parse
- Может использоваться для проверки как объекта Json, так и массиваисточник
JContainer.Parse("1234");
.Основываясь на ответе Хабиба, вы можете написать метод расширения:
Который затем можно использовать так:
источник
JToken.Parse(s);
возвращается,true
даже еслиJToken.Parse(123);
true
для этого недействительногоJSON
:{A:{"B": 1}}
Просто чтобы добавить что-то в ответ @ Habib, вы также можете проверить, является ли данный JSON допустимым типом:
источник
Я обнаружил, что JToken.Parse неправильно анализирует недопустимый JSON, например:
Вставьте строку JSON в http://jsonlint.com/ - она недействительна.
Поэтому я использую:
источник
{ name : "l am invalid JSON" }
Option Альтернативный вариант, не использующий JSON.Net ⚠️
Для .Net Core / .Net 5 ( в предварительном просмотре на момент написания этой статьи ) можно также использовать
System.Text.Json
пространство имен и анализировать с помощьюJsonDocument
. Пример - метод расширения, основанный на операциях пространства имен:источник
Относительно ответа Тома Бича; Вместо этого я придумал следующее:
С использованием следующего:
источник
string
, но этот ответ действительно должен либо а) не быть здесь, либо б) сказать: «Я использовал ответ Тома Бича » безthis
, т.е. без его удлинительного элемента) - и этот ответ и ссылки один имеют одинаковую краткость и слабые стороны. Если вы должны сделать это, просто оставьте комментарий к другому ответу.JToken.Type
доступно после успешного разбора. Это может быть использовано для устранения части преамбулы в ответах выше и обеспечения более точного контроля за результатом. Абсолютно неверный ввод (например,"{----}".IsValidJson();
все равно выдаст исключение).Ссылка на Json.Net для
JToken.Type
: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htmисточник
Этот метод не требует внешних библиотек
источник
Вот метод расширения TryParse, основанный на ответе Хабиба:
Использование:
источник
Я использую это:
источник