Как убедиться, что строка является допустимым JSON с использованием JSON.NET
У меня есть "сырые" строки. Я просто хочу проверить, является ли строка допустимой JSON или нет. Я использую JSON.NET.
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
- можно использовать, чтобы проверить, является ли строка допустимым объектом JsonJArray.Parse
- можно использовать, чтобы проверить, является ли строка допустимым массивом JsonJContainer.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); }