Comment vérifier si une chaîne donnée est valide JSON en Java

Comment valider une chaîne JSON en Java? Ou pourrais-je parsingr en utilisant des expressions régulières?

Une idée farfelue, essayez de l’parsingr et attrapez l’exception:

import org.json.*; public boolean isJSONValid(Ssortingng test) { try { new JSONObject(test); } catch (JSONException ex) { // edited, to include @Arthur's comment // eg in case JSONArray is valid as well... try { new JSONArray(test); } catch (JSONException ex1) { return false; } } return true; } 

Ce code utilise l’ implémentation de l’ API org.json JSON disponible sur github , dans maven et partiellement sur Android .

Bibliothèque JACKSON

Une option serait d’utiliser la bibliothèque Jackson . Importez d’abord la dernière version (maintenant):

  com.fasterxml.jackson.core jackson-databind 2.7.0  

Ensuite, vous pouvez implémenter la bonne réponse comme suit:

 import com.fasterxml.jackson.databind.ObjectMapper; public final class JSONUtils { private JSONUtils(){} public static boolean isJSONValid(Ssortingng jsonInSsortingng ) { try { final ObjectMapper mapper = new ObjectMapper(); mapper.readTree(jsonInSsortingng); return true; } catch (IOException e) { return false; } } } 

Option Google GSON

Une autre option consiste à utiliser Google Gson . Importer la dépendance:

  com.google.code.gson gson 2.5  

Encore une fois, vous pouvez implémenter la solution proposée comme suit:

 import com.google.gson.Gson; public final class JSONUtils { private static final Gson gson = new Gson(); private JSONUtils(){} public static boolean isJSONValid(Ssortingng jsonInSsortingng) { try { gson.fromJson(jsonInSsortingng, Object.class); return true; } catch(com.google.gson.JsonSyntaxException ex) { return false; } } } 

Un test simple suit ici:

 //A valid JSON Ssortingng to parse. Ssortingng validJsonSsortingng = "{ \"developers\": [{ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " + "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}"; // Invalid Ssortingng with a missing parenthesis at the beginning. Ssortingng invalidJsonSsortingng = "\"developers\": [ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " + "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}"; boolean firstSsortingngValid = JSONUtils.isJSONValid(VALID_JSON_STRING); //true boolean secondSsortingngValid = JSONUtils.isJSONValid(NOT_VALID_JSON_STRING); //false 

Veuillez noter qu’il pourrait y avoir un problème “mineur” dû aux virgules qui seront corrigées dans la version 3.0.0 .

Avec Google Gson, vous pouvez utiliser JsonParser:

 import com.google.gson.JsonParser; JsonParser parser = new JsonParser(); parser.parse(json_ssortingng); // throws JsonSyntaxException 

Vous pouvez utiliser le .mayBeJSON (Ssortingng str) disponible dans la bibliothèque JSONUtils .

Cela dépend de ce que vous essayez de prouver avec votre validation. Bien sûr, parsingr le json comme d’autres l’ont suggéré est mieux que d’utiliser des expressions rationnelles, parce que la grammaire de json est plus compliquée que ce qui peut être représenté avec les seules expressions rationnelles.

Si json ne sera analysé que par votre code Java, utilisez le même parsingur pour le valider.

Mais l’parsing ne vous dira pas nécessairement si elle sera acceptée dans d’autres environnements. par exemple

  • de nombreux parsingurs ignorent les virgules de fin dans un object ou un tableau, mais les anciennes versions d’IE peuvent échouer lorsqu’elles atteignent une virgule de fin.
  • D’autres parsingurs peuvent accepter une virgule de fin, mais append ensuite une entrée non définie / null.
  • Certains parsingurs peuvent autoriser des noms de propriété non cotés.
  • Certains parsingurs peuvent réagir différemment aux caractères non-ASCII dans les chaînes.

Si votre validation doit être très approfondie, vous pouvez:

 Ssortingng jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here JSONReader reader = new JSONValidatingReader(); Object result = reader.read(jsonInput); System.out.println("Validation Success !!"); 

Veuillez télécharger la bibliothèque ssortingngtree-json

Vous pouvez trouver ici un outil capable de valider un fichier JSON, ou simplement désérialiser votre fichier JSON avec n’importe quelle bibliothèque JSON et si l’opération est réussie, elle devrait être valide ( google-json par exemple qui lancera une exception si l’entrée c’est l’parsing syntaxique n’est pas valide JSON).

Un peu à propos de l’parsing:

Json, et en fait toutes les langues, utilisent une grammaire qui est un ensemble de règles pouvant être utilisées comme substitutions. pour parsingr json, vous devez essentiellement travailler sur ces substitutions en sens inverse

Json est une grammaire sans contexte , ce qui signifie que vous pouvez avoir des objects / tableaux nesteds à l’infini et que json sera toujours valide. regex ne gère que les grammaires régulières (d’où le «reg» dans le nom), qui est un sous-ensemble de grammaires sans contexte qui ne permet pas l’imbrication infinie. Il est donc impossible d’utiliser uniquement regex pour parsingr tous les json valides. Vous pourriez utiliser un ensemble compliqué de regex et de boucles en supposant que personne ne laissera passer, disons, 100 niveaux, mais ce serait quand même très difficile.

si vous êtes en train d’écrire votre propre parsingur
vous pourriez faire un parsingur de descente récursif après avoir travaillé la grammaire

En utilisant Playframework 2.6, la bibliothèque Json trouvée dans l’API java peut également être utilisée pour simplement parsingr la chaîne. La chaîne peut être soit un élément json du tableau json. Étant donné que la valeur renvoyée n’a pas d’importance ici, nous interceptons simplement l’erreur d’parsing pour déterminer si la chaîne est une chaîne json correcte ou non.

  import play.libs.Json; public static Boolean isValidJson(Ssortingng value) { try{ Json.parse(value); return true; } catch(final Exception e){ return false; } } 

J’ai trouvé une solution très simple pour cela.

Veuillez d’abord installer cette bibliothèque net.sf.json-lib pour cela.

  import net.sf.json.JSONException; import net.sf.json.JSONSerializer; private static boolean isValidJson(Ssortingng jsonStr) { boolean isValid = false; try { JSONSerializer.toJSON(jsonStr); isValid = true; } catch (JSONException je) { isValid = false; } return isValid; } public static void testJson() { Ssortingng vjson = "{\"employees\": [{ \"firstName\":\"John\" , \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}"; Ssortingng ivjson = "{\"employees\": [{ \"firstName\":\"John\" ,, \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}"; System.out.println(""+isValidJson(vjson)); // true System.out.println(""+isValidJson(ivjson)); // false } 

Terminé. Prendre plaisir

Les réponses sont partiellement correctes. J’ai aussi fait face au même problème. Analyser le json et vérifier l’exception semble être la méthode habituelle mais la solution échoue pour json quelque chose comme

{“outputValueSchemaFormat”: “”, “sortByIndexInRecord”: 0, “sortOrder”: 847874874387209 “descendant”} kajhfsadkjh

Comme vous pouvez le voir, json est invalide car il contient des caractères de mémoire. Mais si vous essayez d’parsingr le json ci-dessus en utilisant jackson ou gson, vous obtiendrez la carte analysée des json valides et les caractères traînants seront ignorés. Ce qui n’est pas la solution requirejse lorsque vous utilisez l’parsingur pour vérifier la validité de json.

Pour la solution à ce problème, voir ici .

PS: Cette question a été posée et répondue par moi.