web-dev-qa-db-ja.com

Java文字列が有効なJSONまたは有効なXMLであるか、どちらでもないかどうかを確認します

入力文字列が有効なJSONか有効なXMLか、またはどちらでもないかどうかをチェックする関数を書いています。私は投稿を見つけました ここ 。ただし、文字列が<または{で始まるかどうかのみをチェックするため、投稿の回答は間違いです。文字列がvalidJSONまたはvalidXML。

私は自分自身で解決策を持っています:

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

より良いまたはより短い解決策があるかどうか私は思っていますか?ありがとう。

11
6324

何かがjsonまたはxmlであるかどうかを実際に確認するには、それを試して解析する必要があります-これに対する「フラット文字列」の解決策はありません(非常に有名な関連質問 here を参照)

ここで私が考えることができる唯一の改善領域は、解析のパフォーマンスです。

  1. dOMツリーを生成するjsonパーサーを使用しているようです。つまり、メモリ内にjsonを表すオブジェクトツリーが作成され、有効なjsonかどうかを確認するだけで済みます。ストリーミングjsonを使用すると( here を参照)、メモリオーバーヘッドが低くても同じ結果が得られます(実際にはツリーは作成されません)。
  2. parseXMLの機能はわかりませんが、上記と同じ問題が発生する可能性があります
3
radai

まず第一に、JSONまたはXML検証のコードを再発明する必要があるとは思いません。それはすでに利用可能で、十分にテストされ、非常に最適化されています。

JSONの場合:ここ からJSONObjectを使用できます。これが demo です。

XMLの場合:整形式のXMLを確認する場合は、おそらく DocumentBuilder を使用する必要があります。デモ:

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

解析してみてください。失敗しない場合は、XMLに移行できました。適切に応じて、dBuilder.parse()のオーバーロードメソッドを試してください

2
Preetam Kumar

ここに私がそれをする方法があります。

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