Java/Android – Convalidare la Stringa JSON contro Stringa schema

Sto avendo problemi a trovare il modo più semplice per convalidare una Stringa JSON a fronte di un dato JSON-schema di Stringa (per riferimento, questo è in Java, in esecuzione in un app Android).

Idealmente, mi piacerebbe passare una Stringa JSON e JSON-schema di Stringa e restituisce un booleano che, se passa la validazione. Attraverso la ricerca, ho trovato i seguenti 2 promettente librerie per la realizzazione di questo:

http://jsontools.berlios.de/

https://github.com/fge/json-schema-validator

Il primo, tuttavia, sembra abbastanza obsoleti con scarso sostegno. Ho implementato la libreria nel mio progetto, e anche con loro Javadoc, sono stato in grado di spiegare come costruire correttamente un “Validatore” oggetto per la convalida.

Storia simile con il 2°, il che sembra essere up-to-date con un buon codice di test. Tuttavia, per quello che voglio fare, che è molto semplice, sembra essere un po ‘ scoraggiante e confusione, come specificamente realizzare quello che voglio (anche dopo aver guardato il ValidateServlet.java file).

Curioso di sapere se qualcuno ha altri suggerimenti su un buon modo per ottenere questo risultato (da quello che sembra), compito semplice che ha bisogno, o se forse ho bisogno di attaccare con la 2 ° opzione dall’alto? Grazie in anticipo!

  • Autore di json-schema-validator qui… non hai visto che nel file README che c’era un link a esempi di codice? 😉
  • Ciao a tutti, e grazie per il vostro grande libreria! Sì, l’ho fatto vedere gli esempi di codice e menzionata nel mio post con un link incorporato (il ValidateServlet.java file). Grazie ancora per questa libreria! Grandi cose 🙂
  • Io non stavo parlando di questo esempio: io stavo parlando di com.github.fge.jsonschema.examples nel javadoc 😉 BTW, 1.6.0 è fuori.
  • Ah non ho notato che poi! Grazie per il testa a testa che, così come la nuova versione. 🙂
  • Mi sembra di non riuscire a ottenere questo lavoro su Android targeting api 23
InformationsquelleAutor svguerin3 | 2013-01-24

 

3 Replies
  1. 10

    Questo è essenzialmente ciò che la Servlet si è collegato, quindi non può essere un one-liner ma è ancora espressive.

    useV4 e useId come specificato nella servlet, sono per specificare le convalide opzione per Default to draft v4 e Use id for addressing.

    Si può vedere online: http://json-schema-validator.herokuapp.com/

    public boolean validate(String jsonData, String jsonSchema, boolean useV4, boolean useId) throws Exception {
       //create the Json nodes for schema and data
       JsonNode schemaNode = JsonLoader.fromString(jsonSchema); //throws JsonProcessingException if error
       JsonNode data = JsonLoader.fromString(jsonData);         //same here
    
       JsonSchemaFactory factory = JsonSchemaFactories.withOptions(useV4, useId);
       //load the schema and validate
       JsonSchema schema = factory.fromSchema(schemaNode);
       ValidationReport report = schema.validate(data);
    
       return report.isSuccess();
    }
    • Brillante, grazie! Credo che probabilmente ho solo bisogno di una spinta nella direzione giusta e il modo corretto di usare questa libreria. Davvero apprezzato!
    • Si noti che l’applicazione rileva $schema di default su progetto di v3. Nella maggior parte dei casi, è possibile utilizzare solo la JsonSchemaFactory.defaultFactory().
  2. 13

    Grato, grazie a Douglas Crockford e Francesco Galiegue per la scrittura basata su java json schema del processore! E il tester di linea a http://json-schema-validator.herokuapp.com/index.jsp è impressionante! Mi piacciono molto i messaggi di errore utile (ho trovato solo un esempio in cui hanno fallito), anche se di riga e di colonna e/o contesto sarebbe ancora meglio (per adesso, è solo riga e la colonna durante formato JSON errori (per gentile concessione di Jackson). Infine, vorrei ringraziare Michael Droettboom per la sua grande tutorial (anche se ha solo coperto, Python, Ruby, C, mentre evidentemente ignorando la lingua migliore di tutti :-)).

    Per quelli che l’hanno perso (come facevo prima), ci sono esempi sono github.com/fge/json-schema-processor-examples. Mentre questi esempi sono molto impressionanti, non sono la semplice json convalida esempi che sono stati originariamente richiesto (e che anch’io stavo cercando). Semplici esempi sono github.com/fge/json-schema-validator/blob/master/src/main/java/com/github/fge/jsonschema/examples/Example1.java

    Di Alex, il codice di cui sopra non ha funzionato per me, ma è stato molto utile; il mio pom sta tirando l’ultima versione stabile, la versione 2.0.1 con le seguenti dipendenza inserito nel mio maven pom.xml file:

    <dependency>
        <groupId>com.github.fge</groupId>
        <artifactId>json-schema-validator</artifactId>
        <version>2.0.1</version>
    </dependency>

    Quindi il seguente codice java funziona bene per me:

    import java.io.IOException;
    import java.util.Iterator;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.github.fge.jsonschema.exceptions.ProcessingException;
    import com.github.fge.jsonschema.main.JsonSchema;
    import com.github.fge.jsonschema.main.JsonSchemaFactory;
    import com.github.fge.jsonschema.report.ProcessingMessage;
    import com.github.fge.jsonschema.report.ProcessingReport;
    import com.github.fge.jsonschema.util.JsonLoader;
    
    
    public class JsonValidationExample  
    {
    
    public boolean validate(String jsonData, String jsonSchema) {
        ProcessingReport report = null;
        boolean result = false;
        try {
            System.out.println("Applying schema: @<@<"+jsonSchema+">@>@ to data: #<#<"+jsonData+">#>#");
            JsonNode schemaNode = JsonLoader.fromString(jsonSchema);
            JsonNode data = JsonLoader.fromString(jsonData);         
            JsonSchemaFactory factory = JsonSchemaFactory.byDefault(); 
            JsonSchema schema = factory.getJsonSchema(schemaNode);
            report = schema.validate(data);
        } catch (JsonParseException jpex) {
            System.out.println("Error. Something went wrong trying to parse json data: #<#<"+jsonData+
                    ">#># or json schema: @<@<"+jsonSchema+">@>@. Are the double quotes included? "+jpex.getMessage());
            //jpex.printStackTrace();
        } catch (ProcessingException pex) {  
            System.out.println("Error. Something went wrong trying to process json data: #<#<"+jsonData+
                    ">#># with json schema: @<@<"+jsonSchema+">@>@ "+pex.getMessage());
            //pex.printStackTrace();
        } catch (IOException e) {
            System.out.println("Error. Something went wrong trying to read json data: #<#<"+jsonData+
                    ">#># or json schema: @<@<"+jsonSchema+">@>@");
            //e.printStackTrace();
        }
        if (report != null) {
            Iterator<ProcessingMessage> iter = report.iterator();
            while (iter.hasNext()) {
                ProcessingMessage pm = iter.next();
                System.out.println("Processing Message: "+pm.getMessage());
            }
            result = report.isSuccess();
        }
        System.out.println(" Result=" +result);
        return result;
    }
    
    public static void main(String[] args)
    {
        System.out.println( "Starting Json Validation." );
        JsonValidationExample app = new JsonValidationExample();
        String jsonData = "\"Redemption\"";
        String jsonSchema = "{ \"type\": \"string\", \"minLength\": 2, \"maxLength\": 11}";
        app.validate(jsonData, jsonSchema);
        jsonData = "Agony";  //Quotes not included
        app.validate(jsonData, jsonSchema);
        jsonData = "42";
        app.validate(jsonData, jsonSchema);
        jsonData = "\"A\"";
        app.validate(jsonData, jsonSchema);
        jsonData = "\"The pity of Bilbo may rule the fate of many.\"";
        app.validate(jsonData, jsonSchema);
    }
    
    }

    Mio risultato dal suddetto codice è:

    Starting Json Validation.
    Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"Redemption">#>#
     Result=true
    Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<Agony>#>#
    Error. Something went wrong trying to parse json data: #<#<Agony>#># or json schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@. Are the double quotes included?
     Result=false
    Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<42>#>#
    Processing Message: instance type does not match any allowed primitive type
     Result=false
    Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"A">#>#
    Processing Message: string is too short
     Result=false
    Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"The pity of Bilbo may rule the fate of many.">#>#
    Processing Message: string is too long
     Result=false

    Godere!

    • Bell’esempio Grazie !
    • Grande! Grazie
  3. 2

    @Alex la risposta per me ha funzionato su Android, ma mi ha richiesto di Multi-dex e aggiungere:

        packagingOptions {
            pickFirst 'META-INF/ASL-2.0.txt'
            pickFirst 'draftv4/schema'
            pickFirst 'draftv3/schema'
            pickFirst 'META-INF/LICENSE'
            pickFirst 'META-INF/LGPL-3.0.txt'
        }

    a mio build.gradle

Lascia un commento