Как проверить json файл на существование всех ключей и при необходимости добавить нужный(java)?
Пытаюсь более детально обработать ошибки синтаксиса JSON. Нужно чтобы при считывании файла производилась валидация на наличие определенных полей. В случае наличия таких ошибок пользователь должен выбрать:
- указать значение
- пропустить этот объект и загрузить оставшиеся объекты из файла в коллекцию.
Допустим, мы удалили из файла поле name (т.е. полностью "name": "P3111"). И надо чтобы программа выдавала У вас в одном из объектов ошибка поля name. Xотите его дописать, либо пропустить загрузку этого объекта? (true/false)
Мой метод reader (загрузчик JSON). Под полем name я подразумеваю именно имя группы.
/**
* Чтение коллекции из файла
*
* @return коллекция, которая была считана из файла
*/
public PriorityQueue<StudyGroup> readCollection() {
if (file!= null) {
if (file.exists() & !file.canRead()) {
System.out.println("\u001B[37m" + "\u001B[31m" + "Недостаточно прав для чтения данных из файла. Добавьте права на чтение и запустите программу вновь" + "\u001B[31m" + "\u001B[37m");
System.exit(0);
}
try (FileReader fileScanner= new FileReader(file)) {
BufferedInputStream reader= new BufferedInputStream(new FileInputStream((file)));
Type collectionType = new TypeToken<PriorityQueue<StudyGroup>>(){}.getType();
PriorityQueue<StudyGroup> collection = gson.fromJson(fileScanner, collectionType);
reader.readAllBytes();
System.out.println("\u001B[37m" + "\u001B[33m" + "Коллекция успешно загружена!" + "\u001B[33m" + "\u001B[37m");
if (collection == null) return new PriorityQueue<>();
return collection;
} catch (FileNotFoundException e) {
System.err.println("Файл с таким именем не найден :(");
} catch (IOException e) {
System.err.println("Ошибка ввода-вывода");
} catch (JsonSyntaxException e) {
System.err.println("Формат файла не удовлетворяет условию");
}
catch (RuntimeException e){
Messages.normalMessageOutput("\u001B[37m" + "\u001B[33m"+"Файл написан с ошибкой, перепроверьте файл и запустите программу снова"+ "\u001B[33m" + "\u001B[37m");
}
} else
System.out.println("\u001B[37m" + "\u001B[31m" + "Системная переменная с загрузочным файлом не найдена!" + "\u001B[31m" + "\u001B[37m");
return new PriorityQueue<>();
}
JSON файл:
[
{
"id": 4229754249302793000,
"name": "P3111",
"coordinates": {
"x": 32,
"y": -360
},
"creationDate": {
"date": {
"year": 2021,
"month": 4,
"day": 27
},
"time": {
"hour": 10,
"minute": 41,
"second": 15,
"nano": 506122400
}
},
"studentsCount": 32,
"expelledStudents": 5,
"formOfEducation": "DISTANCE_EDUCATION",
"semesterEnum": "FIRST",
"groupAdmin": {
"name": "Маша",
"passportID": "123",
"eyeColor": "BLACK",
"hairColor": "BLACK",
"nationality": "USA"
}
},
{
"id": 5576486070722418000,
"name": "P3111",
"coordinates": {
"x": 32,
"y": -360
},
"creationDate": {
"date": {
"year": 2021,
"month": 4,
"day": 27
},
"time": {
"hour": 10,
"minute": 41,
"second": 24,
"nano": 974652600
}
},
"studentsCount": 32,
"expelledStudents": 5,
"formOfEducation": "DISTANCE_EDUCATION",
"semesterEnum": "FIRST",
"groupAdmin": {
"name": "Маша",
"passportID": "123",
"eyeColor": "BLACK",
"hairColor": "BLACK",
"nationality": "USA"
}
}
]
Ответы (1 шт):
Предлагаю Вам посмотреть в сторону JSON Schema. Можно по Вашим данным сгенерировать схему, например, воспользовавшись одним из генераторов.
Вот пример получившейся схемы по Вашим данным (использвался онлайн генератор quicktype.io):
{
"$schema": "http://json-schema.org/draft-06/schema#",
"type": "array",
"items": {
"$ref": "#/definitions/WelcomeElement"
},
"definitions": {
"WelcomeElement": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"coordinates": {
"$ref": "#/definitions/Coordinates"
},
"creationDate": {
"$ref": "#/definitions/CreationDate"
},
"studentsCount": {
"type": "integer"
},
"expelledStudents": {
"type": "integer"
},
"formOfEducation": {
"type": "string"
},
"semesterEnum": {
"type": "string"
},
"groupAdmin": {
"$ref": "#/definitions/GroupAdmin"
}
},
"required": [
"coordinates",
"creationDate",
"expelledStudents",
"formOfEducation",
"groupAdmin",
"id",
"name",
"semesterEnum",
"studentsCount"
],
"title": "WelcomeElement"
},
"Coordinates": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"type": "integer"
},
"y": {
"type": "integer"
}
},
"required": [
"x",
"y"
],
"title": "Coordinates"
},
"CreationDate": {
"type": "object",
"additionalProperties": false,
"properties": {
"date": {
"$ref": "#/definitions/Date"
},
"time": {
"$ref": "#/definitions/Time"
}
},
"required": [
"date",
"time"
],
"title": "CreationDate"
},
"Date": {
"type": "object",
"additionalProperties": false,
"properties": {
"year": {
"type": "integer"
},
"month": {
"type": "integer"
},
"day": {
"type": "integer"
}
},
"required": [
"day",
"month",
"year"
],
"title": "Date"
},
"Time": {
"type": "object",
"additionalProperties": false,
"properties": {
"hour": {
"type": "integer"
},
"minute": {
"type": "integer"
},
"second": {
"type": "integer"
},
"nano": {
"type": "integer"
}
},
"required": [
"hour",
"minute",
"nano",
"second"
],
"title": "Time"
},
"GroupAdmin": {
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string"
},
"passportID": {
"type": "string",
"format": "integer"
},
"eyeColor": {
"type": "string"
},
"hairColor": {
"type": "string"
},
"nationality": {
"type": "string"
}
},
"required": [
"eyeColor",
"hairColor",
"name",
"nationality",
"passportID"
],
"title": "GroupAdmin"
}
}
}
Далее необходимо выбрать и подключить одну из реализаций валидаторов, наиболее подходящую для Ваших нужд.