【问题标题】:Java check if a string is valid JSON or valid XML or neitherJava 检查字符串是有效的 JSON 还是有效的 XML,或者两者都不是
【发布时间】:2017-09-09 22:27:39
【问题描述】:

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

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

【问题讨论】:

    标签: java json xml


    【解决方案1】:

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

    如果是 JSON: 您可以使用来自Here 的 JSONObject。这是demo

    如果是 XML:如果您想检查格式正确的 XML,您可能应该使用 DocumentBuilder 。演示:

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

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

    【讨论】:

    • XML Validator 根据指定模式测试给定文档。这样的验证在这里是不必要的,因为 OP 要求解析给定的字符串以检查给定的字符串是 JSON 还是 XML,简单地说只是进行简单的令牌解析。
    • 感谢您的回答。在我的情况下,XmlSourceFile 是一个字符串,所以我会将XmlSourceFile 替换为new InputSource(new StringReader(XmlSourceFile)
    • 可以通过 InputStream 解析字符串。 dBuilder.parse(new ByteArrayInputStream(strXML.getBytes("UTF-8")));
    【解决方案2】:

    您说得对,要真正查看是 json 还是 xml,您必须尝试解析它 - 没有“扁平字符串”解决方案(请参阅非常著名的相关问题 here

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

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

    【讨论】:

    • 感谢您的回答。我刚刚尝试过使用 JSON 和 XML 流。看起来 JSON 流解析器会将无效的 JSON/XML 识别为 JSON,而 XML 流解析器会将无效的 JSON/XML 识别为 XML。所以当我同时使用两个流解析器时会出现问题。我目前的解决方案虽然有效。但是你指出了我不知道的关键点。这可能会在将来对我有所帮助。
    • @Yilong - 有多个流式 xml 和 json 解析器,每个都有自己的配置选项。如果它们都不能配置得更严格并发出错误事件/异常,我会感到惊讶,但我自己从来没有这样做过,所以我不确定。
    【解决方案3】:

    这就是我会怎么做..

    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
        }
    

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多