NinjaCat
NinjaCat

Reputation: 10194

How to Validate JSON with Jackson JSON

I am trying to use Jackson JSON take a string and determine if it is valid JSON. Can anyone suggest a code sample to use (Java)?

Upvotes: 48

Views: 112192

Answers (7)

mc20
mc20

Reputation: 1175

Inproving the other answers

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);
        mapper.readTree(json);
    } catch(JsonProcessingException e){
        valid = false;
    }
    return valid;
}

Upvotes: 1

Ilya Lysenko
Ilya Lysenko

Reputation: 1892

private boolean isValidJson(String json) {
    try {
        objectMapper.readTree(json);
    } catch (JsonProcessingException e) {
        return false;
    }
    return true;
}

Upvotes: 3

gil.fernandes
gil.fernandes

Reputation: 14591

Another option would be using java.util.Optional in Java 8. This allows to return an object and to use in the calling code a more functional approach.

This is another possible implementation:

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);
    }
}

Then you can use this method like this:

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

Upvotes: 1

StaxMan
StaxMan

Reputation: 116472

I would recommend using Bean Validation API separately: that is, first bind data to a POJO, then validate POJO. Data format level Schemas are in my opinion not very useful: one usually still has to validate higher level concerns, and schema languages themselves are clumsy, esp. ones that use format being validated (XML Schema and JSON Schema both have this basic flaw). Doing this makes code more modular, reusable, and separates concerns (serialization, data validation).

But I would actually go one step further, and suggest you have a look at DropWizard -- it integrates Jackson and Validation API implementation (from Hibernate project).

Upvotes: 13

madx
madx

Reputation: 7201

With Jackson I use this function:

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

Upvotes: 15

holmis83
holmis83

Reputation: 16604

Although Perception's answer probably will fit many needs, there are some problems it won't catch, one of them is duplicate keys, consider the following example:

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

As a complement, you can check for duplicate keys with the following code:

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

It throws JsonProcessingException on duplicate key or other error.

Upvotes: 25

Perception
Perception

Reputation: 80593

Not sure what your use case for this is, but this should do it:

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;
}

Upvotes: 44

Related Questions