Como validar uma string JSON em Java? Ou eu poderia analisá-lo usando expressões regulares?
java
json
validation
sappu
fonte
fonte
Respostas:
Uma ideia selvagem, tente analisá-la e pegue a exceção:
Esse código usa a implementação da API JSON org.json, disponível no github , no maven e parcialmente no Android .
fonte
Biblioteca JACKSON
Uma opção seria usar a biblioteca Jackson . Primeiro importe a versão mais recente (agora é):
Em seguida, você pode implementar a resposta correta da seguinte maneira:
Opção Google GSON
Outra opção é usar o Google Gson . Importe a dependência:
Novamente, você pode implementar a solução proposta como:
Um teste simples segue aqui:
Observe que pode haver um problema "menor" devido às vírgulas à direita que serão corrigidas na versão
3.0.0
.fonte
new ObjectMapper().readTree("28xjRBuOQqupRopHeSuhRQ")
Armadilha de JACKSON: analisa sem exceção como IntNode (28). Realmente não é esperado ... #Com o Google Gson, você pode usar o JsonParser:
fonte
Você poderia usar o .mayBeJSON (String str) disponível na biblioteca JSONUtils .
fonte
Depende do que você está tentando provar com sua validação. Certamente analisar o json como outros sugeriram é melhor do que usar regexes, porque a gramática do json é mais complicada do que pode ser representada apenas com regexes.
Se o json for analisado apenas pelo seu código java, use o mesmo analisador para validá-lo.
Mas apenas analisar não necessariamente indica se será aceito em outros ambientes. por exemplo
Se sua validação precisar ser muito completa, você poderá:
fonte
Faça o download da biblioteca stringtree-json
fonte
Um pouco sobre a análise:
O Json e, de fato, todos os idiomas, usam uma gramática, que é um conjunto de regras que podem ser usadas como substituições. para analisar json, você precisa basicamente trabalhar essas substituições em sentido inverso
Json é uma gramática livre de contexto , o que significa que você pode ter objetos / matrizes infinitamente aninhados e o json ainda seria válido. regex apenas lida com gramáticas regulares (daí o 'reg' no nome), que é um subconjunto de gramáticas livres de contexto que não permite aninhamento infinito, por isso é impossível usar apenas regex para analisar todo json válido. você pode usar um conjunto complicado de regex e loops com a suposição de que ninguém irá aninhar, digamos, 100 níveis de profundidade, mas ainda assim seria muito difícil.
se você está disposto a escrever seu próprio analisador,
você pode fazer um analisador de descida recursivo depois de elaborar a gramática
fonte
Verifique se uma determinada sequência é JSON válida no Kotlin . I Resposta convertida de MByD Java para Kotlin
fonte
Aqui, você pode encontrar uma ferramenta que pode validar um arquivo JSON ou apenas desserializar seu arquivo JSON com qualquer biblioteca JSON e, se a operação for bem-sucedida, ela deverá ser válida ( google-json, por exemplo, que lançará uma exceção se a entrada está analisando não é JSON válido).
fonte
Usando o Playframework 2.6, a biblioteca Json encontrada na java api também pode ser usada para simplesmente analisar a string. A cadeia pode ser um elemento json da matriz json. Como o valor retornado não é importante aqui, apenas capturamos o erro de análise para determinar se a sequência é uma sequência json correta ou não.
fonte
IMHO, a maneira mais elegante é usar a API Java para JSON Processing (JSON-P), um dos padrões JavaEE em conformidade com o JSR 374 .
Usando o Maven, adicione a dependência no JSON-P:
Visite a página oficial do JSON-P para mais informações.
fonte
Aqui está um exemplo de trabalho para análise estrita do json com a biblioteca gson :
Consulte também minha outra resposta detalhada em Como verificar se o JSON é válido em Java usando o GSON com mais informações e caso de teste estendido com vários exemplos não válidos.
fonte
Como você pode ver, existem muitas soluções, elas analisam principalmente o JSON para verificá-lo e, no final, você precisará analisá-lo para ter certeza.
Mas, dependendo do contexto, você pode melhorar as performances com uma pré-verificação.
O que faço quando chamo APIs, é apenas verificar se o primeiro caractere é '{' e o último é '}'. Se não for o caso, não me incomodo em criar um analisador.
fonte
Eu encontrei uma solução muito simples para isso.
Por favor, primeiro instale esta biblioteca
net.sf.json-lib
para ela.Feito. Aproveitar
fonte
As respostas estão parcialmente corretas. Eu também enfrentei o mesmo problema. Analisar o json e verificar a exceção parece a maneira usual, mas a solução falha para a entrada json algo como
{"outputValueSchemaFormat": "", "sortByIndexInRecord": 0, "sortOrder": 847874874387209 "descendente"} kajhfsadkjh
Como você pode ver, o json é inválido, pois há caracteres de lixo à direita. Mas se você tentar analisar o json acima usando jackson ou gson, obterá o mapa analisado dos caracteres válidos de rastreamento de lixo e json e ignorados. Qual não é a solução necessária quando você está usando o analisador para verificar a validade do json.
Para solução para este problema, veja aqui .
PS: Esta pergunta foi feita e respondida por mim.
fonte
e então chame essa função passando na sua JSON String :)
fonte
A solução acima abrange os dois cenários:
fonte
Uma solução usando a
javax.json
biblioteca:fonte
Você pode usar a
WellFormedJson
classe da biblioteca de validação declarativa Validol .A declaração em si pode ter a seguinte aparência:
A fase de verificação é assim:
Pode parecer um exagero para uma tarefa tão simples, mas brilha quando você precisa validar uma solicitação complexa. Confira a seção de início rápido do validol .
fonte