smilysubbu
smilysubbu

Reputation: 75

Jackson: JSON parsing for array of parent elements : Root name '' does not match expected ('List')

I am getting the following exception after writing the below code.

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Root name 'Filing' does not match expected ('List') for type [collection type; class java.util.List, contains [simple type, class MasMonthlyReportDetail]]

JSON Object

{
     "Filing":
    [
           {
                "periodInfo":
                    {
                         "date": "06-05-2013",
                 "year": "2015",
                 "Month": "January"

                    },
            "employerInfo":
                {
                 "name": "Y",
                 "place": "Y",
                 "country": "N",

                    },
                "employeeInfo":
                    [
                         {
                              "name": "785-23-0370",                  
                  "dob": "05/25/1952",

                         }
                    ],
                "messages": 
                [
                     {
                  "defaultMessage" : "xx",
                  "messageType" : "yy",
                  "messageCode" : "102"
                 }
                ]
          },

               {
                "periodInfo":
                    {
                         "date": "06-05-2013",
                 "year": "2015",
                 "Month": "January"

                    },
            "employerInfo":
                {
                 "name": "Y",
                 "place": "Y",
                 "country": "N",

                    },
                "employeeInfo":
                    [
                         {
                              "name": "785-23-0370",                  
                  "dob": "05/25/1952",

                         }
                    ],
                "messages": 
                [
                     {
                  "defaultMessage" : "xx",
                  "messageType" : "yy",
                  "messageCode" : "102"
                 }
                ]
          }
    ]
}

Main Class

ObjectMapper objectMapper = new ObjectMapper();        

objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

List<MasMonthlyReportDetail> lcd =  objectMapper.readValue(new File(filePath),new TypeReference<List<MasMonthlyReportDetail>>(){});

MasMonthlyReportDetail.java

@JsonRootName(value="Filing")

public class MasMonthlyReportDetail {

    private PeriodInfo periodInfo;
    private EmployerInfo employerInfo;
    List<EmployeeInfo> employeeInfo;
    List<Messages> messages;

    public PeriodInfo getPeriodInfo() {
        return periodInfo;
    }
    public void setPeriodInfo(PeriodInfo periodInfo) {
        this.periodInfo = periodInfo;
    }
    public EmployerInfo getEmployerInfo() {
        return employerInfo;
    }
    public void setEmployerInfo(EmployerInfo employerInfo) {
        this.employerInfo = employerInfo;
    }
    public List<EmployeeInfo> getEmployeeInfo() {
        return employeeInfo;
    }
    public void setEmployeeInfo(List<EmployeeInfo> employeeInfo) {
        this.employeeInfo = employeeInfo;
    }
    public List<Messages> getMessages() {
        return messages;
    }
    public void setMessages(List<Messages> messages) {
        this.messages = messages;
    }

}

Upvotes: 2

Views: 12151

Answers (2)

Vijay Anand Mareddy
Vijay Anand Mareddy

Reputation: 75

have u tried this ? jacksonObjectMapper.reader(MasMonthlyReportDetail.class).withRootName("Filing").readValue(jsonAsString);

Upvotes: -1

smilysubbu
smilysubbu

Reputation: 75

I made the following changes and the code worked for me.

Main Class:

InputStream inputStream = resource.getInputStream();

ObjectMapper objectMapper = new ObjectMapper();

MasMonthlyReportDetailHolder masMonthlyReportDetailHolder = objectMapper.readValue(inputStream, MasMonthlyReportDetailHolder.class);

List<MasMonthlyReportDetail> masMonthlyReportDetail = masMonthlyReportDetailHolder.getMasMonthlyReportDetail();

MasMonthlyReportDetailHolder class:

public class MasMonthlyReportDetailHolder {

    private List<MasMonthlyReportDetail> masMonthlyReportDetail;

    @JsonProperty("Filing")
    public List<MasMonthlyReportDetail> getMasMonthlyReportDetail() {
        return masMonthlyReportDetail;
    }

    public void setMasMonthlyReportDetail(
            List<MasMonthlyReportDetail> masMonthlyReportDetail) {
        this.masMonthlyReportDetail = masMonthlyReportDetail;
    }

}

Adding @JsonProperty("Filing") is the key to avoid this issue. In case of any other procedure, do let me know.

Upvotes: 4

Related Questions