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
risposta
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;
}
getJsonFactory() è deprecato. – Arash
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
entrambi i metodi sono deprecati: getJsonFactory(). CreateJsonParser (json). Utilizzare questa istanza: getFactory(). CreateParser (json) – kiedysktos
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).
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
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
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.
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;
}
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");
Come fai a Defina che JSON è valida? – Slavus
@Slavus: qualsiasi stringa che soddisfi lo standard di sintassi JSON è un JSON valido. Non definiamo un JSON valido. – Vivek
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