#java #json
#java #json
Вопрос:
У меня есть конечная точка API, где я получаю файлы JSON, и я создаю объект из файлов. У меня также есть другой уже существующий объект, и я пытаюсь проверить, соответствуют ли определенные значения в полученном JSON определенным значениям в моем существующем объекте. Если поля совпадают, я продолжу обрабатывать файл дальше, если нет, я удалю его. Пока что я думаю только о том, чтобы операторы if проверяли каждое значение, но есть ли лучший способ сделать это? Или инструкции if в порядке?
Очень быстрый пример кода, показывающий, что я имею в виду, просто используя операторы if.
public boolean compareObjects(recievedObject, existingObject) {
if( !(recievedObject.getName().equals(existingObject.getName()))) {
//true
} else if( !(recievedObject.getLocation().equals(existingObject.getLocation())) ) {
return false;
}
// else if ... etc
return true;
}
Обратите внимание, что я не пытаюсь проверить, содержит ли полученный файл все требуемые поля JSON, просто несколько конкретных полей имеют определенные значения.
Редактировать:
JSON будет очень плоской структурой, например
{
"name": "name",
"location": "location",
...
}
Итак, мой объект будет довольно простым
public class recievedObject {
String location;
String name;
public String getLocation() {
return location;
}
public String getName() {
return name;
}
}
Комментарии:
1. Вы должны показать пример кода, который мог бы стать отправной точкой для решения.
2. Вам нужно, по крайней мере, описать структуру вашего документа JSON.
3. Что вы подразумеваете под «лучшим способом»? Если у вас есть способ, который работает, и он работает так, как вам нужно, и соответствует всем вашим требованиям, тогда в чем проблема?
Ответ №1:
Что вы можете сделать, чтобы избежать множества операторов it-else, так это создать некоторую абстракцию проверки.
interface Validator<A, B> {
boolean validate(A receivedObject, B existingObject);
}
Затем для каждого if
создайте новую реализацию Validator
.
class NameValidator implements Validator<Expeceted, Received> {
@Override
public boolean validate(Expeceted receivedObject, Received existingObject) {
return existingObject.getName().equals(receivedObject.getName());
}
}
class LocationValidator implements Validator<Expeceted, Received> {
@Override
public boolean validate(Expeceted receivedObject, Received existingObject) {
return existingObject.getLocation().equals(receivedObject.getLocation());
}
}
Вы можете создать список таких валидаторов
List<Validator<Expeceted, Received>> validators = Arrays.asList(
new NameValidator(),
new LocationValidator()
);
И, наконец, ваш метод сравнения может просто выполнить итерацию по всем валидаторам.
public boolean compareObjects(Received recievedObject, Expeceted expecetedObject) {
for (Validator<Expeceted, Received> validation : validators) {
if (! validation.validate(expecetedObject, recievedObject)) {
return false;
}
}
return true;
}
Таким образом, вы можете просто добавить новые средства проверки позже и оставить метод сравнения нетронутым.
Ответ №2:
определите метод, аналогичный ‘equal’ для вашего класса, и в конечной точке проверьте существующий OBJECT.check(receivedObject), добавьте import java.util.Объекты для вашего класса
public boolean check(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RecievedObject receivedObject=(RecievedObject) o;
//add based on the logic you want
return Objects.equals(location, receivedObject.location) amp;amp;
Objects.equals(name, receivedObject.name);
}