2012-04-19 20 views
22

Ich versuche Jackson JSON zu verwenden, nehme eine Zeichenkette und bestimme, ob es JSON ist. Kann jemand vorschlagen, ein Codebeispiel zu verwenden (Java)?Wie validiere ich JSON mit Jackson JSON

+1

Wie DeFina Sie, dass JSON gültig ist? – Slavus

+1

@Slavus: Jeder String, der den JSON-Syntax-Standard erfüllt, ist ein gültiger JSON. Wir definieren kein gültiges JSON. – Vivek

+0

Ich bin Jahre alt und das war vielleicht 2012 nicht verfügbar, aber denken Sie an [JSON Schema] (http://json-schema.org/)? – Stroboskop

Antwort

27

nicht sicher, was Ihr Anwendungsfall hierfür ist, aber das sollte es tun:

public boolean isValidJSON(final String json) { 
    boolean valid = false; 
    try { 
     final JsonParser parser = new ObjectMapper().getJsonFactory() 
      .createJsonParser(json); 
     while (parser.nextToken() != null) { 
     } 
     valid = true; 
    } catch (JsonParseException jpe) { 
     jpe.printStackTrace(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 

    return valid; 
} 
+3

getJsonFactory() ist veraltet. – Arash

+0

Kurze und elegante Lösung ist hier verfügbar [Danke an @pdem] (http://StackOverflow.com/a/29414638/452708) 'versuchen { ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree (yourJsonString); } catch (JsonProcessingException e) {........} ' – Abhijeet

+1

Beide Methoden wurden abgeschrieben: getJsonFactory(). CreateJsonParser (json). Verwenden Sie dies: getFactory(). CreateParser (JSON) – kiedysktos

10

würde ich empfehlen, Bean Validation API separat verwendet: das heißt, zunächst binden Daten an ein POJO, dann POJO validieren. Datenformat-Ebenen Schemas sind meiner Meinung nach nicht sehr nützlich: Man muss in der Regel immer noch Probleme auf höherer Ebene validieren, und Schema-Sprachen selbst sind ungeschickt, vor allem. diejenigen, die das validierte Format verwenden (XML-Schema und JSON-Schema haben beide diesen grundlegenden Fehler). Dadurch wird Code modularer, wiederverwendbarer und trennt Probleme (Serialisierung, Datenvalidierung).

Aber ich würde tatsächlich einen Schritt weiter gehen und vorschlagen, dass Sie sich DropWizard anschauen - es integriert Jackson und Validation API-Implementierung (vom Hibernate-Projekt).

+0

Dropwizard scheint sich in ein neues Zuhause (www.dropwizard.io) begeben zu haben und nennt sich jetzt "ein Java-Framework für die Entwicklung von ops-freundlichem, leistungsstarkem, REST-konformem Web Dienstleistungen".Haben Sie nicht gelesen, aber es möglicherweise noch Jackson und Validierungs API integriert. Nicht sicher, ob Sie den ganzen Rest brauchen. – Wivani

+0

Ja, DropWizard integriert ab sofort Jackson und Validation API (Februar 2016). Ich sehe keine Veränderung für das Projekt, es ist an diesem Punkt ziemlich ausgereift. Sie können natürlich andere bindende Bibliotheken verwenden (JAX-RS ist hochgradig steckbar), aber als Basis werden diese 2 Bibliotheken wahrscheinlich übrig bleiben. – StaxMan

12

Obwohl die Wahrnehmung Antwort wahrscheinlich viele Bedürfnisse passen, gibt es einige Probleme wird es nicht, einer von ihnen ist Nachschlüssel, betrachten Sie das folgende Beispiel fangen:

String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }"; 

Als Ergänzung können Sie überprüfen, für Nachschlüssel mit dem folgenden Code:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); 
objectMapper.readTree(json); 

Es JsonProcessingException auf doppelten Schlüssel oder andere Fehler auslöst.

7

Mit Jackson verwende ich diese Funktion:

public static boolean isValidJSON(final String json) throws IOException { 
    boolean valid = true; 
    try{ 
     objectMapper.readTree(json); 
    } catch(JsonProcessingException e){ 
     valid = false; 
    } 
    return valid; 
} 
1

Eine weitere Option wäre mit java.util.Optional in Java 8. Dies ermöglicht es, ein Objekt zurückzukehren und in dem anrufenden Code eines funktioneller Ansatz zu verwenden.

Dies ist eine weitere mögliche Implementierung:

public Optional<JsonProcessingException> validateJson(final String json) { 
    try{ 
     objectMapper.readTree(json); 
     return Optional.empty(); 
    } catch(JsonProcessingException e){ 
     return Optional.of(e); 
    } catch(IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

Dann können Sie diese Methode wie folgt verwenden:

jsonHelper.validateJson(mappingData.getMetadataJson()) 
        .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString())) 
        .orElse("Valid JSON"); 
Verwandte Themen