ב-Java, JSON, כלומר סימון אובייקט JavaScript, ממלא תפקיד חשוב מאוד במניפולציה של תגובת צד השרת. ב-Java, אנו יכולים לאמת מסמכי JSON מול סכימת JSON. על מנת לבצע את האימות, אנו משתמשים ב- networknt JSON Schema Validator סִפְרִיָה.
הסיבה לשימוש בספרייה זו היא שהיא משתמשת בג'קסון כספריית JSON ותומכת בגרסת JSON Schema העדכנית ביותר. ספריית networknt היא א Java יישום של מפרט JSON Schema Core Draft v4, v6, v7 ו-v2019-09 (בה אנו משתמשים בדוגמה שלנו) עבור אימות סכימת JSON. יש לו את ג'קסון כמנתח JSON ברירת מחדל.
ראשית, ניקח דוגמה של מסמך JSON וסכימת JSON, שבה אנו משתמשים בתוכנית שלנו כדי לבצע אימות.
מסמך JSON
{ 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] }
סכימת JSON
{ '$schema': 'https://json-schema.org/draft/2019-09/schema#', '$id+': 'http://my-paintings-api.com/schemas/painting-schema.json', 'type': 'object', 'title': 'Painting', 'description': 'Painting information', 'additionalProperties': true, 'required': ['name', 'artist', 'description', 'tags'], 'properties': { 'name': { 'type': 'string', 'description': 'Painting name' }, 'artist': { 'type': 'string', 'maxLength': 50, 'description': 'Name of the artist' }, 'description': { 'type': ['string', 'null'], 'description': 'Painting description' }, 'tags': { 'type': 'array', 'items': { '$ref': '#/$defs/tag' } } }, '$defs': { 'tag': { 'type': 'string', 'enum': ['oil', 'watercolor', 'digital', 'famous'] } } }
אנו מוסיפים את התלות הבאה בקובץ pom.xml שלנו.
com.networknt json-schema-validator 1.0.42
אנחנו יכולים גם להשתמש ב org.everit.json ספריה לאימות אובייקט JSON. כדי להשתמש בו, עלינו להוסיף את התלות הבאה בקובץ pom.xml שלנו:
org.everit.json org.everit.json.schema 1.11.1
במקרה שלנו, אנו משתמשים ב- networknt ספריית Java.
אנו משתמשים בשלבים הבאים כדי לאמת את מסמך ה-JSON:
- צור פרויקט מייבן חדש.
- הוסף את התלות של אימות סכימת JSON בקובץ pom.xml שלנו.
- קרא את הנתונים ואת הסכימה ממסמך JSON באמצעות ObjectMapper.
- השתמש בשיטת validate() של JsonSchemaFactory כדי לאמת את מסמך ה-JSON.
- אחסן את התוצאה שהוחזרה בערכת האימות והדפיס אותה על המסך.
הכל מוגדר כעת, כך שנוכל ליישם את הקוד בפועל של אימות מסמך ה-JSON.
JsonValidatorExample.java
//import required classes and packages package javaTpoint.ObjectToJsonConversion; import java.io.InputStream; import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.SpecVersion; import com.networknt.schema.ValidationMessage; // create class to validate JSON document public class JsonValidatorExample { // create inputStreamFromClasspath() method to load the JSON data from the class path private static InputStream inputStreamFromClasspath( String path ) { // returning stream return Thread.currentThread().getContextClassLoader().getResourceAsStream( path ); } // main() method start public static void main( String[] args ) throws Exception { // create instance of the ObjectMapper class ObjectMapper objectMapper = new ObjectMapper(); // create an instance of the JsonSchemaFactory using version flag JsonSchemaFactory schemaFactory = JsonSchemaFactory.getInstance( SpecVersion.VersionFlag.V201909 ); // store the JSON data in InputStream try( InputStream jsonStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\data.json' ); InputStream schemaStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\schema.json' ) ){ // read data from the stream and store it into JsonNode JsonNode json = objectMapper.readTree(jsonStream); // get schema from the schemaStream and store it into JsonSchema JsonSchema schema = schemaFactory.getSchema(schemaStream); // create set of validation message and store result in it Set validationResult = schema.validate( json ); // show the validation errors if (validationResult.isEmpty()) { // show custom message if there is no validation error System.out.println( 'There is no validation errors' ); } else { // show all the validation error validationResult.forEach(vm -> System.out.println(vm.getMessage())); } } } }
תיאור
בקוד לעיל, אנו משתמשים ב- VersionFlag . כדי להשיג את JsonSchemaFactory , נדרש להעביר את דגל הגרסה הזה בבנאי. במקרה שלנו, אנחנו משתמשים את 2019-09 גרסת JSON Schema.
אנו משתמשים גם בשיטת עוזר מותאמת אישית, כלומר, inputStreamFromClasspath(), כדי לטעון את שני הקבצים מ-classpath. אנו יוצרים מופע של המחלקה Jackson ObjectMapper כדי לקרוא את נתוני ה-JSON מה-InputStream. לאחר מכן, אנו מנתחים את נתוני ה-InputStream לאובייקט JsonNode. באמצעות המופע של JsonSchemaFactory, אנו משיגים את האובייקט JsonSchema כדי לאמת את ה-JsonNode. אנו יוצרים קבוצה של שגיאות אימות המכילה אובייקט ValidationMessage אחד או יותר. ערכת האימות תהיה ריקה כאשר אין שגיאת אימות.
תְפוּקָה