Tengo una cuerda cruda. Solo quiero validar si la cadena es JSON válida o no. Estoy usando JSON.NET.
A través del código:
Su mejor opción es usar el análisis dentro de ay try-catch
capturar una excepción en caso de un análisis fallido. (No conozco ningún TryParse
método) .
(Usando JSON.Net)
La forma más simple sería usar Parse
la cadena JToken.Parse
y también verificar si la cadena comienza con {
o [
y termina con }
o ]
respectivamente (agregado de esta respuesta ) :
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;
}
}
La razón para agregar controles para {
o [
etc. se basó en el hecho de que JToken.Parse
analizaría los valores como "1234"
o "'a string'"
como un token válido. La otra opción podría ser usar ambos JObject.Parse
y JArray.Parse
analizar y ver si alguno de ellos tiene éxito, pero creo que verificar {}
y []
debería ser más fácil. (Gracias @RhinoDevel por señalarlo )
Sin JSON.Net
Puede utilizar el espacio de nombres .Net framework 4.5 System.Json , como:
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());
}
(Pero, debe instalar a System.Json
través del administrador de paquetes Nuget usando el comando: PM> Install-Package System.Json -Version 4.0.20126.16343
en la Consola del Administrador de paquetes) (tomado de aquí )
Manera sin código:
Por lo general, cuando hay una pequeña cadena json y estás tratando de encontrar un error en la cadena json, yo personalmente prefiero usar las herramientas en línea disponibles. Lo que suelo hacer es:
JToken.Parse("1234")
! Puede ser una buena idea verificar primero, si la cadena comienza con[
o{
. Otra alternativa es el usoJObject.Parse()
yJArray.Parse()
.JToken.Parse("{a:1}")
no no lanzar una excepción a pesar de que esto es válido JSON -a
debe ser citado ( stackoverflow.com/q/949449/3116322 )Use el
JContainer.Parse(str)
método para verificar si el str es un Json válido. Si esto arroja una excepción, entonces no es un Json válido.JObject.Parse
- Se puede usar para verificar si la cadena es un objeto Json válidoJArray.Parse
- Se puede usar para verificar si la cadena es una matriz Json válidaJContainer.Parse
- Se puede usar para verificar tanto el objeto Json como la matrizfuente
JContainer.Parse("1234");
.Sobre la base de la respuesta de Habib, podría escribir un método de extensión:
Que luego se puede usar así:
fuente
JToken.Parse(s);
vuelvetrue
incluso siJToken.Parse(123);
true
para este inválidoJSON
:{A:{"B": 1}}
Solo para agregar algo a la respuesta de @ Habib, también puede verificar si JSON dado es de un tipo válido:
fuente
Descubrí que JToken.Parse analiza incorrectamente JSON inválido como el siguiente:
Pegue la cadena JSON en http://jsonlint.com/ , no es válida.
Entonces uso:
fuente
{ name : "l am invalid JSON" }
⚠️ Opción alternativa que no usa JSON.Net ⚠️
Para .Net Core / .Net 5 ( en la vista previa al momento de escribir esto ) también se puede usar el
System.Text.Json
espacio de nombres y analizar usandoJsonDocument
. El ejemplo es un método de extensión basado en las operaciones de espacio de nombres:fuente
Con respecto a la respuesta de Tom Beech; En su lugar, se me ocurrió lo siguiente:
Con un uso de lo siguiente:
fuente
string
, pero esta respuesta realmente debería a) no estar aquí o b) decir " Usé la respuesta de Tom Beech " sin elthis
, es decir, sin convertirlo en un miembro de extensión), tanto esta respuesta como la referenciada tienen una brevedad y debilidad idénticas. Si debe hacer este punto, simplemente ponga un comentario en la otra respuesta.JToken.Type
está disponible después de un análisis exitoso. Esto se puede utilizar para eliminar algunos de los preámbulos en las respuestas anteriores y proporcionar información para un control más preciso del resultado. Entrada completamente inválida (por ejemplo,"{----}".IsValidJson();
todavía arrojará una excepción).Referencia de Json.Net para
JToken.Type
: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htmfuente
Este método no requiere bibliotecas externas
fuente
Aquí hay un método de extensión TryParse basado en la respuesta de Habib:
Uso:
fuente
Estoy usando este:
fuente