14

Given the following data

{
   "version" : 1,
   "data" : [ [1,2,3], [4.5,6]]
}

I tried the following definitions and used ObjectMapper.readValue(jsonstring, Outer.class)

class Outer {
  public int version;
  public List<Inner> data
}

class Inner {
   public List<Integer> intlist;
}

I got:

Can not deserialize instance of Inner out of START_ARRAY token"

In the Outer class, if I say

List<List<Integer> data;

then deserialization works.

But in my code, the Outer and Inner classes have some business logic related methods and I want to retain the class stucture.

I understand that the issue is that Jackson is unable to map the inner array to the 'Inner' class. Do I have to use the Tree Model in Jackson? Or is there someway I can still use the DataModel here ?

1 Answer 1

10

Jackson needs to know how to create an Inner instance from an array of ints. The cleanest way is to declare a corresponding constructor and mark it with the @JsonCreator annotation.

Here is an example:

public class JacksonIntArray {
    static final String JSON = "{ \"version\" : 1, \"data\" : [ [1,2,3], [4.5,6]] }";

    static class Outer {
        public int version;
        public List<Inner> data;

        @Override
        public String toString() {
            return "Outer{" +
                    "version=" + version +
                    ", data=" + data +
                    '}';
        }
    }

    static class Inner {
        public List<Integer> intlist;

        @JsonCreator
        public Inner(final List<Integer> intlist) {
            this.intlist = intlist;
        }

        @Override
        public String toString() {
            return "Inner{" +
                    "intlist=" + intlist +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        final ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.readValue(JSON, Outer.class));
    }

Output:

Outer{version=1, data=[Inner{intlist=[1, 2, 3]}, Inner{intlist=[4, 6]}]}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.