Eugene
Eugene

Reputation: 60184

Parsing JSON with Jackson. Why HashMap instead of my type?

I'm using a Jackson library to parse JSON:

{
"employees": [
{ "firstName":"John" , "lastName":"Doe" }, 
{ "firstName":"Anna" , "lastName":"Smith" }, 
{ "firstName":"Peter" , "lastName":"Jones" }
]
}

Here is what I'm doing:

public void testJackson() throws IOException {
    JsonFactory factory = new JsonFactory();
    ObjectMapper mapper = new ObjectMapper(factory);
    File from = new File("emp.txt"); // JSON object comes from
    TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
    HashMap<String, Object> o = mapper.readValue(from, typeRef);
    Employees employees = new Employees();
    employees.employees = (List<Employer>)o.get("employees"); // retrieving list of Employer(s)
    employees.showEmployer(1); // choose second to print out to console

    System.out.println("Got " + o); // just result of file reading
}

public static class Employees {
    public List<Employer> employees;

    public void showEmployer(int i) {
        System.out.println(employees.get(i));
    }
}

public static class Employer {
    public String firstName;
    public String lastName;
}

The output I'm getting:

{firstName=Anna, lastName=Smith}

Got {employees=[{firstName=John, lastName=Doe}, {firstName=Anna, lastName=Smith}, {firstName=Peter, lastName=Jones}]}

But I'm not expecting the elements in my List to be HashMap instances, but Employer objects. This is what Jackson library is supposed to be, isn't it? Could you guys correct me where I am wrong?

Upvotes: 1

Views: 2564

Answers (1)

Benjamin Cox
Benjamin Cox

Reputation: 6120

I haven't used Jackson, but it seems you're getting what you asked for - a HashMap of String, Object pairs. Perhaps you need to be more explicit in the 'value' portion of the map? Since the value is an array of Employee objects, you might try:

TypeReference<HashMap<String, List<Employee>>> typeRef = new TypeReference<HashMap<String, List<Employee>>>() {};
HashMap<String, List<Employee>> o = mapper.readValue(from, typeRef);

Upvotes: 5

Related Questions