MAHI
MAHI

Reputation: 10163

jackson deserialization json to java-objects

Here is my Java code which is used for the de-serialization, i am trying to convert json string into java object. In doing so i have used the following code:

package ex1jackson;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Ex1jackson {
public static void main(String[] args) {
   ObjectMapper mapper = new ObjectMapper();
try {
        String userDataJSON = "[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"
                              + "{\"id\": \"value21\",\"name\":\"value22\",\"qty\": \"value23\"}]";
        product userFromJSON = mapper.readValue(userDataJSON, product.class);
        System.out.println(userFromJSON);
    } catch (JsonGenerationException e) {
        System.out.println(e);
        } catch (JsonMappingException e) {
       System.out.println(e);
    } catch (IOException e) {
    System.out.println(e);
    } 
}
}

and my product.java class

package ex1jackson;
public class product 
{
private String id;
private String name; 
private String qty; 

@Override
public String toString() {
    return "Product [id=" + id+ ", name= " + name+",qty="+qty+"]";
}
}

i am getting the following error.

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "id" (class ex1jackson.product), not marked as ignorable (0 known properties: ]) at 
[Source: java.io.StringReader@16f76a8; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) 
BUILD SUCCESSFUL (total time: 0 seconds)

help me to solve this,

Upvotes: 30

Views: 147968

Answers (4)

Steven Schlansker
Steven Schlansker

Reputation: 38526

It looks like you are trying to read an object from JSON that actually describes an array. Java objects are mapped to JSON objects with curly braces {} but your JSON actually starts with square brackets [] designating an array.

What you actually have is a List<product> To describe generic types, due to Java's type erasure, you must use a TypeReference. Your deserialization could read: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

A couple of other notes: your classes should always be PascalCased. Your main method can just be public static void main(String[] args) throws Exception which saves you all the useless catch blocks.

Upvotes: 40

MAHI
MAHI

Reputation: 10163

 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

 System.out.println("id : "+node.findValues("id").get(0).asText());

this also done the trick.

Upvotes: 6

nutlike
nutlike

Reputation: 4975

You have to change the line

product userFromJSON = mapper.readValue(userDataJSON, product.class);

to

product[] userFromJSON = mapper.readValue(userDataJSON, product[].class);

since you are deserializing an array (btw: you should start your class names with upper case letters as mentioned earlier). Additionally you have to create setter methods for your fields or mark them as public in order to make this work.

Edit: You can also go with Steven Schlansker's suggestion and use

List<product> userFromJSON =
        mapper.readValue(userDataJSON, new TypeReference<List<product>>() {});

instead if you want to avoid arrays.

Upvotes: 18

Esteban Araya
Esteban Araya

Reputation: 29654

Your product class needs a parameterless constructor. You can make it private, but Jackson needs the constructor.

As a side note: You should use Pascal casing for your class names. That is Product, and not product.

Upvotes: 2

Related Questions