web-dev-qa-db-fra.com

Java vérifie si une chaîne est valide JSON ou XML valide ou non

J'écris une fonction pour vérifier si la chaîne d'entrée est valide JSON, XML valide ou aucun des deux. J'ai trouvé un post ici . Mais évidemment, les réponses dans l'article sont incorrectes car elles vérifient uniquement si la chaîne commence par < ou {, ce qui ne peut garantir que la chaîne est valid JSON ou valid XML. 

J'ai moi-même une solution:

public static String getMsgType(String message) {
    try {
        new ObjectMapper().readTree(message);
        log.info("Message is valid JSON.");
        return "JSON";
    } catch (IOException e) {
        log.info("Message is not valid JSON.");
    }

    try {
        DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(message)));
        log.info("Message is valid XML.");
        return "XML";
    } catch (Exception e) {
        log.info("Message is not valid XML.");
    }

    return null;
}

Je me demande s'il existe une solution meilleure ou plus courte? Merci.

5
6324

vous avez raison de voir si quelque chose est json ou xml, vous devez essayer de l’analyser comme tel - il n’existe pas de solution "plate" (voir la très célèbre question connexe ici )

le seul domaine d'amélioration auquel je pourrais penser ici est la performance de l'analyse syntaxique:

  1. il semble que vous utilisiez un analyseur JSON produisant une arborescence DOM. cela signifie que vous vous retrouvez avec une arborescence d'objets en mémoire représentant le json, alors que tout ce que vous vouliez était de voir si son json était valide ou non. en utilisant le streaming json (voir ici ), vous pourriez obtenir les mêmes résultats avec un surcoût de mémoire réduit (aucune arborescence réellement créée)
  2. je ne sais pas ce que fait parseXML mais il souffre probablement du même problème que ci-dessus
3
radai

Tout d'abord, je ne pense pas que vous deviez réinventer le code pour la validation JSON ou XML. Il est déjà disponible, bien testé et assez optimisé.

Dans le cas de JSON: Vous pouvez utiliser JSONObject à partir de Ici . Voici démo à ce sujet.

En cas de XML: Vous devriez probablement utiliser un DocumentBuilder si vous voulez vérifier le XML bien formé. Démo:

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(XmlSourceFile);

Essayez d’analyser, si cela n’échoue pas, vous avez tout intérêt à utiliser XML. essayez méthodes surchargées de dBuilder.parse() selon votre convenance 

2
Preetam Kumar

voici comment je le ferais ..

To validate if a string is JSON

    //isValidJson = false;
    /*try 
    {
    Gson gs = new Gson();
    Object ob = gs.ToJson(yourStringToValidate)
    isValidJson = true;
    }
    catch  
    {
    //do nothing
    }

    isValidXML = false;
    /*try 
    {
    //using JAXB try converting to a Java object
    JAXBContext jaxbContext = JAXBContext.newInstance(Object.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Object obj = (Object) unmarshaller.unmarshal(YourString/Fileobj);

    isValidXML = true;
    }
    catch  
    {
    //do nothing
    }
0
Ashish Madkaikar