JsonMappingException: Can not instantiate value of type no single-long-arg constructor/factory method

30,971

The first thing is to remove the @JsonRootName(value = "currentTime") annotation as @aymeric suggested. This annotation is telling the Jackson mapper that, while your POJO calls this thing 'Agency_coverage', the matching JSON object will be calling it 'currentTime'. That is not the case.

Now, that aside, your JSON should look more like this:

{"Agency_coverage":{"currentTime":1355390722038,"text":"OK","data":"etc..."}}

The difference here is that you are providing the root element for Jackson to unwrap.

You can now see what the error from Jackson was saying. With the JSON you provided and the annotation you were using, it found currentTime as the JSON element which maps to the Agency_coverage POJO but the value for currentTime was a long and couldn't be mapped.

Share:
30,971
Admin
Author by

Admin

Updated on December 16, 2020

Comments

  • Admin
    Admin over 3 years

    hi am getting error trying to parse a json response into java on zk framework

    here is the jason reply

    {"currentTime":1355390722038,"text":"OK","data":{"limitExceeded":false,"references":{"stops":[],"situations":[],"trips":[],"routes":[],"agencies":[{"id":"AG1","privateService":false,"phone":"","timezone":"Asia/Kuala_Lumpur","disclaimer":"","name":"Panorama","lang":"en","url":"http://www.allcompanyonline.com/company/33/8/26/62438/PM-Cultural--Tourism-Sdn-Bhd.html"}]},"list":[{"lonSpan":0.1766824722290039,"lon":102.2011971473685,"agencyId":"AG1","lat":2.2659808772471948,"latSpan":0.15555363245723042}]},"code":200,"version":2}
    

    i keep getting this error

    com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.panorama.tripplan.pojo.Agency_coverage] from Long integral number; no single-long-arg constructor/factory method
    

    here is the pojo for the root variables

    @JsonRootName(value = "currentTime")
    public class Agency_coverage{
    private Number code;
    private Number currentTime;
    private Data data;
    private String text;
    private Number version;
    
    public Agency_coverage(){}
    
    public Number getCode(){
        return this.code;
    }
    public void setCode(Number code){
        this.code = code;
    }
    public Number getCurrentTime(){
        return this.currentTime;
    }
    public void setCurrentTime(Number currentTime){
        this.currentTime = currentTime;
    }
    public Data getData(){
        return this.data;
    }
    public void setData(Data data){
        this.data = data;
    }
    public String getText(){
        return this.text;
    }
    public void setText(String text){
        this.text = text;
    }
    public Number getVersion(){
        return this.version;
    }
    public void setVersion(Number version){
        this.version = version;
    }
    

    here is the code where i attempt to call the api and parse the response

    java.net.URLConnection connection = new URL(url + "?" + query+ "&" + queryLat+ "&" + queryLon).openConnection();
           connection.setRequestProperty("Accept-Charset", charset);
           if ( connection instanceof HttpURLConnection)
           {
             //Jackson 2.X configuration settings
                mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    
                mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
                mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
                mapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true);
                mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
                mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
                //Tell Jackson to expect the JSON in PascalCase, instead of camelCase
                mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.PascalCaseStrategy());
    
              HttpURLConnection httpConnection =(HttpURLConnection) connection;  
            //Make the HTTP request, and deserialize the JSON response into the object
    
              Agency_coverage agencyData= new Agency_coverage();
              agencyData = mapper.readValue(agenturl, Agency_coverage.class);
    
    
              //System.out.println(agencyData.getData().getList().get(0).);
              System.out.println(agencyData.getCurrentTime());
              System.out.println(httpConnection.getResponseCode());
    
           }
    

    please help if you can understand this problem, i am a bit new to java development and am giving it my all