Search code examples
jsonjava-8jacksonjettison

Simple JSON value parsing for Java 8


Java 8 here though I have Jackson and Jettison on my classpath already (as dependencies).

I am being given the following string of JSON (as an example):

{
    "widgets": {
        "email": "someone@example.com",
        "maxSize": 50
    },
    "environments": {
        "LOCAL": {
            "maxSize": "40"
        },
        "DEV": {
            "maxSize": "100"
        }
    },
    "fruits": [
        "apples",
        "oranges"
    ]
}

At runtime the values of the fields will be different.

I am just trying to read the value of environments/DEV/maxSize from this string; what is the simplest code I can write to extract this value?

Ideally there might be some built in Java 8 support for this type of thing, but if note, I hopefully either Jackson or Jettison ship with this capability without having to add a new jar/dependency to my project. Worst case scenario would be just using some kind of regex to strip out the value I suppose...

Any ideas?


Solution

  • A simple option would be to use JsonPath. Nested properties can be pulled using a path specifier like $.environments.DEV.maxSize:

    long maxSize = JsonPath.parse(json).read("$.environments.DEV.maxSize", Long.class);
    

    With Jackson, this can be done either with JsonNode:

    long maxSize = new ObjectMapper()
        .readTree(json)
        .get("environments").get("DEV").get("maxSize").asLong();
    

    Or if you have a class that represents the data, you can deserialize to that:

    MyConfig myConfig = new ObjectMapper().readValue(json, MyConfig.class);
    long maxSize = myConfig.getEnvironments().get(Environment.DEV).getMaxSize();