У меня есть необработанная строка. Я просто хочу проверить правильность строки 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; }
}