Java 检查字符串是有效的 JSON 还是有效的 XML,或者两者都不是

2022-09-03 07:50:08

我正在编写一个函数来检查输入字符串是有效的JSON还是有效的XML,或者两者都不是。我在这里找到了一个帖子。但显然,帖子中的答案是不正确的,因为他们只检查字符串是否以或开头,这不能保证字符串是有效的JSON或有效的XML。<{

我自己确实有一个解决方案,那就是:

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;
}

我想知道是否有任何更好或更短的解决方案?谢谢。


答案 1

首先,我认为您不必重新发明JSON或XML验证的代码。它已经可用,经过充分测试并且经过了相当优化。

在JSON的情况下:您可以从此处使用JSONObject。这是关于这一点的演示

在XML的情况下:如果你想检查格式正确的XML,你应该使用DocumentBuilder。演示:

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

尝试解析,如果它没有失败,你就可以很好地使用XML。根据您的适用性尝试重载方法dBuilder.parse()


答案 2

你是正确的,要真正看到某些东西是json还是xml,你必须尝试解析它 - 没有“扁平字符串”解决方案(请参阅这里非常着名的相关问题)

我能想到的唯一改进领域是解析的性能:

  1. 它似乎你正在使用一个生成DOM树的json解析器。这意味着你最终会在内存中得到一个表示json的对象树,而你想要的只是看看它是否有效的json。使用流json(见这里),你可以得到相同的结果,更低的内存开销(实际上没有创建树)
  2. 我不知道parseXML做什么,但它可能会遇到与上面相同的问题