Jackson parse string field as JSON

Rostyslav Roshak :

I have the following JSON:

{
    "some_key": "{\"a\": 1, \"b\": \"text\"}"
}

As you can see some_key field is not a JSON object it is a string, that contains valid JSON.

I would like to parse it into following structure:

class Foo {
    Bar some_key;
}

class Bar {
    int a;
    String b;
}

UPDATE:

  • class A and B, has getters and setters, constructors. I haven't show them to keep sample short and simple.

  • I can't edit the weird structure of the JSON.

  • The question is how to ask Jackson parse the inner string field as JSON object.

df778899 :

@t_liang is very close - just need a bit more room than a comment to show the working example...

With:

class Foo {
    @JsonDeserialize(using = BarDeserializer.class)
    private Bar some_key;
}

Then the current ObjectMapper is actually the JsonParser.getCodec():

public class BarDeserializer extends JsonDeserializer<Bar> {
    @Override
    public Bar deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        String text = p.getText();
        ObjectMapper mapper = (ObjectMapper) p.getCodec();
        return mapper.readValue(text, Bar.class);
    }
}

Then this...

ObjectMapper mapper = new ObjectMapper();

Foo foo = mapper.readValue(
        "{ \"some_key\": \"{\\\"a\\\": 1, \\\"b\\\": \\\"text\\\"}\" }",
        Foo.class);

System.out.println(foo.getSome_key());

... shows the expected value:

Bar [a=1, b=text]

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=450822&siteId=1