Eu tenho uma string crua. Eu só quero validar se a string é JSON válida ou não. Estou usando o JSON.NET.
Através do código:
Sua melhor aposta é usar a análise dentro de try-catch
e capturar uma exceção em caso de falha na análise. (Não conheço nenhum TryParse
método) .
(Usando JSON.Net)
A maneira mais simples seria Parse
a string usando JToken.Parse
, e também para verificar se a string começa com {
ou [
e termina com }
ou ]
respectivamente (adicionado a partir desta resposta ) :
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;
}
}
O motivo para adicionar verificações para {
ou [
etc foi baseado no fato de que JToken.Parse
analisaria os valores como "1234"
ou "'a string'"
como um token válido. A outra opção poderia ser usar ambos JObject.Parse
e JArray.Parse
na análise e ver se algum deles foi bem-sucedido, mas acredito que procurar {}
e []
deve ser mais fácil. (Obrigado @RhinoDevel por apontar )
Sem JSON.Net
Você pode utilizar o namespace System.Json do .Net framework 4.5 , 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());
}
(Mas você deve instalar System.Json
através do gerenciador de pacotes Nuget usando o comando: PM> Install-Package System.Json -Version 4.0.20126.16343
no Package Manager Console) (extraído daqui )
Maneira sem código:
Normalmente, quando há uma pequena string json e você está tentando encontrar um erro na string json, eu pessoalmente prefiro usar as ferramentas on-line disponíveis. O que eu costumo fazer é:
JToken.Parse("1234")
! Pode ser uma boa idéia verificar primeiro, se a string começa com[
ou{
. Outra alternativa é usarJObject.Parse()
eJArray.Parse()
.JToken.Parse("{a:1}")
se não lançar exceção, embora este é JSON inválido -a
deve ser citado ( stackoverflow.com/q/949449/3116322 )Use o
JContainer.Parse(str)
método para verificar se o str é um Json válido. Se isso gera exceção, não é um Json válido.JObject.Parse
- Pode ser usado para verificar se a string é um objeto Json válidoJArray.Parse
- Pode ser usado para verificar se a string é um Json Array válidoJContainer.Parse
- Pode ser usado para verificar o objeto Json e a Matrizfonte
JContainer.Parse("1234");
.Com base na resposta de Habib, você pode escrever um método de extensão:
Que pode ser usado assim:
fonte
JToken.Parse(s);
retornatrue
mesmo seJToken.Parse(123);
true
para este inválidoJSON
:{A:{"B": 1}}
Apenas para adicionar algo à resposta do @ Habib, você também pode verificar se o JSON fornecido é de um tipo válido:
fonte
Descobri que o JToken.Parse analisa incorretamente o JSON inválido, como o seguinte:
Cole a sequência JSON em http://jsonlint.com/ - é inválida.
Então eu uso:
fonte
{ name : "l am invalid JSON" }
Option️ Opção alternativa que não usa JSON.Net ⚠️
Para .Net Core / .Net 5 ( em pré-visualização até o momento em que este artigo foi escrito ), também é possível usar o
System.Text.Json
espaço para nome e analisar usando oJsonDocument
. O exemplo é um método de extensão baseado nas operações do espaço para nome:fonte
Em relação à resposta de Tom Beech; Eu vim com o seguinte:
Com o uso do seguinte:
fonte
string
, mas essa resposta realmente deveria a) não estar aqui ou b) dizer "usei a resposta de Tom Beech " sem othis
, isto é, sem torná-lo um membro de extensão) - tanto essa resposta quanto a referência têm brevidade e fraquezas idênticas. Se você precisar fazer isso, basta comentar a outra resposta.JToken.Type
está disponível após uma análise bem-sucedida. Isso pode ser usado para eliminar parte do preâmbulo nas respostas acima e fornecer informações para um controle mais preciso do resultado. Entrada totalmente inválida (por exemplo,"{----}".IsValidJson();
ainda lançará uma exceção).Referência do Json.Net para
JToken.Type
: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htmfonte
Este método não requer bibliotecas externas
fonte
Aqui está um método de extensão TryParse com base na resposta de Habib:
Uso:
fonte
Eu estou usando este:
fonte