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

时间:2017-04-13 17:28:50

标签: java json xml

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

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

3 个答案:

答案 0 :(得分:3)

你是对的,要真正看到某些东西是json还是xml,你必须尝试并解析它 - 没有&#34;扁平字符串&#34;解决方案(见非常着名的相关问题here

我能想到的唯一改进方面是解析的性能:

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

答案 1 :(得分:2)

首先,我不认为你必须重新发明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()方法

答案 2 :(得分:0)

这是我要怎么做..

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
    }