Подтвердить что ты не робот

Как проверить JSON с Jackson JSON

Я пытаюсь использовать Jackson JSON взять строку и определить, действительно ли она JSON. Может ли кто-нибудь предложить образец кода для использования (Java)?

4b9b3361

Ответ 1

Не уверен, что ваш вариант использования для этого, но это должно сделать это:

public boolean isValidJSON(final String json) {
   boolean valid = false;
   try {
      final JsonParser parser = new ObjectMapper().getJsonFactory()
            .createJsonParser(json);
      while (parser.nextToken() != null) {
      }
      valid = true;
   } catch (JsonParseException jpe) {
      jpe.printStackTrace();
   } catch (IOException ioe) {
      ioe.printStackTrace();
   }

   return valid;
}

Ответ 2

Хотя ответ Perception, вероятно, будет соответствовать многим потребностям, есть некоторые проблемы, которые он не поймает, один из них является дубликатными ключами, рассмотрим следующий пример:

String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }";

В качестве дополнения вы можете проверить дубликаты ключей со следующим кодом:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
objectMapper.readTree(json);

Он бросает JsonProcessingException на дубликат ключа или другую ошибку.

Ответ 3

Я бы рекомендовал использовать Bean API проверки отдельно: то есть сначала привязать данные к POJO, а затем проверить POJO. Уровень данных. Схемы, на мой взгляд, не очень полезны: обычно обычно приходится проверять проблемы более высокого уровня, а сами языки схем неуклюжи, особенно. которые используют проверенный формат (схема XML и схема JSON имеют этот основной недостаток). Это делает код более модульным, многоразовым и разделяет проблемы (сериализация, проверка данных).

Но я бы сделал еще один шаг вперед и предложил вам взглянуть на DropWizard - он интегрирует API Jackson и Validation (из проекта Hibernate).

Ответ 4

С помощью Jackson я использую эту функцию:

public static boolean isValidJSON(final String json) throws IOException {
    boolean valid = true;
    try{ 
        objectMapper.readTree(json);
    } catch(JsonProcessingException e){
        valid = false;
    }
    return valid;
}

Ответ 5

Другим вариантом будет использование java.util.Optional в Java 8. Это позволяет возвращать объект и использовать в вызывающем коде более функциональный подход.

Это еще одна возможная реализация:

public Optional<JsonProcessingException> validateJson(final String json) {
    try{ 
        objectMapper.readTree(json);
        return Optional.empty();
    } catch(JsonProcessingException e){
        return Optional.of(e);
    } catch(IOException e) {
        throw new RuntimeException(e);
    }
}

Затем вы можете использовать этот метод следующим образом:

jsonHelper.validateJson(mappingData.getMetadataJson())
                    .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString()))
                    .orElse("Valid JSON");

Ответ 6

Изучение других ответов

public static boolean isValidJSON(final String json) throws IOException {
    boolean valid = true;
    try{ 
        mapper.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
        mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
        objectMapper.readTree(json);
    } catch(JsonProcessingException e){
        valid = false;
    }
    return valid;
}