2012-04-19 37 views
22

Sto cercando di utilizzare Jackson JSON per prendere una stringa e determinare se è JSON valido. Qualcuno può suggerire un esempio di codice da utilizzare (Java)?Come convalidare JSON con Jackson JSON

+1

Come fai a Defina che JSON è valida? – Slavus

+1

@Slavus: qualsiasi stringa che soddisfi lo standard di sintassi JSON è un JSON valido. Non definiamo un JSON valido. – Vivek

+0

Sono in ritardo di anni e questo potrebbe non essere stato disponibile nel 2012, ma stai pensando a [schema JSON] (http://json-schema.org/)? – Stroboskop

risposta

27

Non sei sicuro di ciò che il vostro caso d'uso di questo è, ma questo dovrebbe farlo:

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() è deprecato. – Arash

+0

Qui è disponibile una soluzione breve ed elegante [Grazie a @pdem] (http://stackoverflow.com/a/29414638/452708) 'try { ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree (yourJsonString); } catch (JsonProcessingException e) {........} ' – Abhijeet

+1

entrambi i metodi sono deprecati: getJsonFactory(). CreateJsonParser (json). Utilizzare questa istanza: getFactory(). CreateParser (json) – kiedysktos

10

mi consiglia di utilizzare Bean Validation API separatamente: cioè, primi dati associare a un POJO, quindi convalidare POJO. Livello di formato dei dati Gli schemi non sono molto utili a mio avviso: uno di solito deve ancora convalidare i problemi di livello superiore, e i linguaggi di schema sono goffi, specialmente. quelli che utilizzano il formato in fase di convalida (XML Schema e JSON Schema hanno entrambi questo difetto di base). Fare ciò rende il codice più modulare, riutilizzabile e separa i problemi (serializzazione, convalida dei dati).

Ma vorrei davvero andare un passo oltre, e vi consiglio di dare un'occhiata al DropWizard - Integra implementazione dell'API Jackson e Validazione (dal progetto Hibernate).

+0

Dropwizard sembra essere passato a una nuova casa (www.dropwizard.io) e si chiama ora "un framework Java per lo sviluppo di un web RESTful efficiente e ad alte prestazioni Servizi".Non ho letto ma potrebbe ancora integrare Jackson e l'API di validazione. Non sono sicuro se hai bisogno di tutto il resto. – Wivani

+0

Sì, DropWizard integra ancora l'API Jackson e Validation sin d'ora (febbraio 2016). Non vedo quelli che cambiano per il progetto, è abbastanza maturo a questo punto. Ovviamente è possibile utilizzare altre librerie di binding (JAX-RS è altamente collegabile), ma come base di partenza queste 2 librerie rimarranno probabilmente. – StaxMan

12

Anche se la risposta di Perception probabilmente si adatta molti bisogni, ci sono alcuni problemi che non prenderà, uno di loro è chiavi duplicate, si consideri il seguente esempio:

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

Come complemento, è possibile verificare la presenza di chiavi duplicate con il seguente codice:

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

Si getta JsonProcessingException sulla chiave duplicata o altro errore.

7

con Jackson Io uso questa funzione:

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

Un'altra opzione sarebbe utilizzando java.util.Optional in Java 8. Questo permette di restituire un oggetto e di utilizzare nel codice chiamante un approccio più funzionale.

Questo è un altro possibile implementazione:

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

Quindi è possibile utilizzare questo metodo come questo:

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