1

I need to deserialize below Json in Java. Can you help me with creating Pojo class?

I have POJO class like below one but when i try to deserialize it is throwing error .

Input Json:

 {
    
        "log": {
            "version": "1.2",
            "creator": "Test",
            "pages": [],
            "entries": [
                {
                    "Tag1": "01"
                },
                {
                    "Tag2": "std"
                }
            ]
        }
    }

Pojo Class

import java.util.ArrayList;

public class Log {
    
    public  Log() {}
    
    private String  version;
    private Creator creator;
    private ArrayList<String> pages;
    private Entries entries[];
    
    public String getVersion() {
        return version;
    }
    public void setVersion(String version) {
        this.version = version;
    }
    public Creator getCreator() {
        return creator;
    }
    public void setCreator(Creator creator) {
        this.creator = creator;
    }
    public ArrayList<String> getPages() {
        return pages;
    }
    public void setPages(ArrayList<String> pages) {
        this.pages = pages;
    }
    public Entries[] getEntries() {
        return entries;
    }
    public void setEntries(Entries[] entries) {
        this.entries = entries;
    }
    
        

}

My Main Class

public class HarNew {

public static void main(String[] args) {
    
    File f = new File("C:\\Users\\Shankar.Manickam\\Desktop\\onerequestwthouttransfer.json");
    
    ObjectMapper mapper =  new ObjectMapper();
     

     
     
    try {
        Log log = mapper.readValue(f, Log.class);
        String s = mapper.writeValueAsString(log);
        System.out.println(s);
        
        System.out.println("URL is\t"+log.getVersion());
        System.out.println("URL is\t"+log.getVersion());
    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

     
}
     

}

Error

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "log" (class Log), not marked as ignorable (4 known properties: "version", "creator", "entries", "pages"]) at [Source: (File); line: 2, column: 10] (through reference chain: Log["log"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:840) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1179) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1592) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1570) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3070) at HarNew.main(HarNew.java:21)

Shankar
  • 51
  • 4
  • 2
    You should have a class that inside have a log and try to make the conversion with this class. – William Andrés Bernal Jul 07 '20 at 17:42
  • If that's the case then how come a new class with just log variable will be able to connect to other sub classes (like Entries)? – Shankar Jul 07 '20 at 17:50
  • Share your `Entries` and `Creator` classes as well, please. – Giorgi Tsiklauri Jul 07 '20 at 17:52
  • 1
    add a wrapper class something like public class LogWrapper{ private Log log; } and then use the LogWrapper class instead of Log class in ObjectMapper – dassum Jul 07 '20 at 17:56
  • @Shankar in the new class, you have an attribute of type log (the log you already have), this class has already the entries – William Andrés Bernal Jul 07 '20 at 18:04
  • 1
    Thanks Everyone. From some other loop of Stack overflow i have figured on how to provide root name for my Pojo class.. @JsonTypeName("log") @JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME) public class Log { Source blog: https://stackoverflow.com/questions/2435527/use-class-name-as-root-key-for-json-jackson-serialization – Shankar Jul 07 '20 at 18:13
  • @Shankar, you did a great job by finding that link! [Use class name as root key for JSON Jackson serialization](https://stackoverflow.com/questions/2435527/use-class-name-as-root-key-for-json-jackson-serialization) – Nowhere Man Jul 07 '20 at 19:00

0 Answers0