Как проверить объект JSON в java?

Я использую библиотеку sf.json для сопоставления данных формы для входящего запроса в моем веб-приложении в java.

Допустим, входящий запрос http://localhost:8080/app/addProfile с данными формы как:

formData: {  
   "name":"applicant Name",
   "Age":"26",
   "academics":{  
      "college":"80",
      "inter":"67",
      "matriculation":"89"
   },
   "skill":{  
      "computer":"c,c++,java",
      "maths":"limit,permutation,statistics"
   },
   "dateOfBirth":"09-07-1988"
}

Сторона сервера:

String requestFormData=request.getParameter("formData");
JSONObject formData = JSONObject.fromObject(requestFormData);
String name= formData.getString("name");

if(name.length>70){
//error message for length validation
}

if(!name.matches("regex for name"){
//error message for name validation
}
...
...
...

Основная проблема с этим подходом заключается в том, что если есть небольшая модификация в структуре JSON, тогда весь код необходимо изменить.

Есть ли API, где я могу настроить правила, необходимые для проверки?


person N3WOS    schedule 16.08.2015    source источник
comment
Я не могу представить себе ситуацию, когда вам понадобится подтверждение, предоставленное вами. Есть много людей с именами (имя и фамилия) длиннее 70 и даже 100 символов.   -  person itwasntme    schedule 16.08.2015
comment
Я бы предпочел найти некоторые уникальные правила проверки, такие как: возраст - положительное число, дата содержит день-месяц-год, пользователь предоставил как минимум 2 навыка в каждой категории.   -  person itwasntme    schedule 16.08.2015


Ответы (3)


Вы можете использовать валидатор Json: - https://github.com/fge/json-schema-validator

Или вы можете просто попытаться проанализировать Json с помощью Google Gson и поймать синтаксическое исключение, чтобы проверить его, как показано ниже:

try{
JsonParser parser = new JsonParser();
parser.parse(passed_json_string);
} 
catch(JsonSyntaxException jse){
System.out.println("Not a valid Json String:"+jse.getMessage());
}

Для универсальной проверки данных определите правила в своей схеме Json, а затем просто проверьте входящий Json по этой схеме.
В схеме вы можете определить тип значений, которые она может содержать, диапазон и т. д.
Для создания схемы вы можно использовать онлайн-инструмент, например: - http://jsonschema.net/#/

Вы можете обратиться к этому сообщению, чтобы быстро понять схему json: - http://json-schema.org/example1.html

Пример:-

"price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }

Приведенный выше код определяет цену в схеме Json, когда объект Json проверяется по этой схеме, он гарантирует, что цена не должна быть равна нулю, она должна быть больше нуля и должна быть числом. Если в цене передана строка, или ноль, или какое-либо отрицательное значение, проверка завершится ошибкой.

person Amit Bhati    schedule 16.08.2015
comment
Привет, Амит, спасибо, он проверяет объект net.sf.json? - person N3WOS; 16.08.2015
comment
Json — это просто формат данных, вы определяете схему для Json, а затем просто проверяете входящий json на соответствие этой схеме. - person Amit Bhati; 16.08.2015
comment
@N3WOS, что вы подразумеваете под проверкой? Вы хотите проверить, являются ли входящие json данные действительными (правильными с точки зрения их спецификации) или вы хотите проверить ввод пользователя (возраст старше 18 лет и т. д.)?? - person itwasntme; 16.08.2015
comment
мастах, я хочу проверить ввод пользователя. Своего рода проверка данных. - person N3WOS; 16.08.2015
comment
@AmitBhati, не могли бы вы рассказать немного больше о проверке JSON с использованием схем? - person itwasntme; 16.08.2015
comment
Gson JsonParser теперь устарел, поэтому вместо этого используйте статическую функцию: JsonParser.parseString(passed_json_string); - person Karishma Gulati; 10.02.2021
comment
Проблема со многими ответами stackoverflow заключается в ссылке, которая приводит к 4o4. Лучше объяснить кодом, а потом давать ссылку. ссылка на схему json. - person suhas0sn07; 03.03.2021

Часто схема json может показаться излишней. На мой вкус, это довольно сложно и неуклюже, а добавление дополнительных правил только усугубляет ситуацию.

Я думаю, что более простой, но все же декларативный подход, используемый в библиотеке validol, может быть хорошей альтернативой. Суть в том, чтобы привязать бизнес-правила к данным, к которым они применяются. Сложные правила украшают более простые. И все дерево проверки представляет собой одно функциональное декларативное выражение. Кроме того, этот подход побуждает вас размещать логику проверки там, где она должна быть: в конкретном пользовательский сценарий.

Вот пример того, как это может выглядеть. Рассмотрим схему для проверки:

{
   "where":{
      "building":1,
      "street":"Red Square"
   }
}

Логика проверки отражает структуру схемы json. Все ограничения описаны прямо в самой структуре. Обо всех рутинных проверках, таких как наличие ключа json, уже позаботились.

Вот оно:

/*1 */        new FastFail<>(
/*2 */            new IsJsonObject(
/*3 */                new WellFormedJson(
/*4 */                    new IndexedValue("where", jsonString)
                      )
                  ),
/*7 */            whereJsonElement ->
/*8 */                new NamedBlocOfNameds<>(
/*9 */                    "where",
/*10*/                    List.of(
/*11*/                        new AsString(
/*12*/                            new Required(
/*13*/                                new IndexedValue("street", whereJsonElement)
                                  )
                              ),
/*16*/                        new AsInteger(
/*17*/                            new Required(
/*18*/                                new IndexedValue("building", whereJsonElement)
                                  )
                              )
                          ),
/*22*/                    Where.class
                )
        )
            .result();

Жаль, что stackoverflow не поддерживает нумерацию строк, но, тем не менее, вот что происходит построчно.

Line 1: Вся проверка — это быстрый сбой, который возвращает ошибку, если первый аргумент приводит к ошибке.
Line 4: Первый аргумент — это объявление блока where.
Line 3: Это должен быть блок правильно сформированный json.
Line 2: Кроме того, это должен быть объект json.
Line 7: Второй аргумент — замыкание. Его первый аргумент – это объект where json.
Line 8: здесь находится именованный блок именованных элементов.
Line 9: его имя – where.
Line 10: второй аргумент – список всех элементов.
Line 13: Первый элемент — street.
Line 12: Обязателен.
Line 11: И должен быть представлен в виде строки.
Line 18: Второй — building.
Line 17: Он также обязателен.
Line 16: И должно быть представлено в виде целого числа.
Line 22: Если все предыдущие проверки прошли успешно, создается объект Where. Его первый аргумент — street, который должен быть строкой; второй — building, который должен быть целым числом.

Взгляните на раздел быстрого старта, где вы найдете дополнительные примеры и пошаговые инструкции. анализ линейного кода.

person Vadim Samokhin    schedule 05.05.2020

Распечатайте объект JSON, используя:

Log.e("JSON OBJECT CREATED:", jsonobject.toString());

А затем используйте онлайн-валидатор json для проверки json.

person Vivek Choudhary    schedule 07.11.2016
comment
Лучший ответ, который я когда-либо видел! :)) - person Hermann; 16.06.2019