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.
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:
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
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
}