簡體   English   中英

無法解析RestTemplate接收到的JSON響應

[英]Cannot Parse a JSON response that is received by RestTemplate

我需要解析從Web服務收到的JSON響應,但我收到以下錯誤消息,對此感到困惑。 我嘗試了沒有結果類,也沒有用。 任何幫助,將不勝感激。

客戶端發送的請求在語法上不正確。

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new 
                                        MappingJackson2HttpMessageConverter());
        ResponseEntity<Results> responseEntity = restTemplate
                .getForEntity(
                        "http://primesport.sieenasoftware.com/QryApi
                         /GetEvents?
                         username=username&
                         password=password&
                         userid=23",
                         Results.class);
        System.err.println(">>" + responseEntity.getBody().getEvents().size());

結果

public class Results {
    private List<Events> events;
    getter and setter
}

活動

   public class Event {
       private long eventId;
       private String name;
       private String subTitle;
       private String description;
       private String localDate;
       private String localDateFrom;
       private String imageUrl;
       private int venueId;
       private String venue;
       private int availableTickets;
       private long performerId;
       private String performer;
       private String performerType;
       private int subcategoryId;
       private String urlCategoryName;
       private String metaTitle;
       private String metaDescription;
       private String primeSportUrl;
       private String sectionWiseView;
       private String venueCity;
       private String venueState;
       private String snippetDate;
       private int eiProductionId;
       private boolean requireBillingAsShipping;
    public long getEventId() {
        return eventId;
    }
    public void setEventId(long eventId) {
        this.eventId = eventId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSubTitle() {
        return subTitle;
    }
    public void setSubTitle(String subTitle) {
        this.subTitle = subTitle;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getLocalDate() {
        return localDate;
    }
    public void setLocalDate(String localDate) {
        this.localDate = localDate;
    }
    public String getLocalDateFrom() {
        return localDateFrom;
    }
    public void setLocalDateFrom(String localDateFrom) {
        this.localDateFrom = localDateFrom;
    }
    public String getImageUrl() {
        return imageUrl;
    }
    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
    public int getVenueId() {
        return venueId;
    }
    public void setVenueId(int venueId) {
        this.venueId = venueId;
    }
    public String getVenue() {
        return venue;
    }
    public void setVenue(String venue) {
        this.venue = venue;
    }
    public int getAvailableTickets() {
        return availableTickets;
    }
    public void setAvailableTickets(int availableTickets) {
        this.availableTickets = availableTickets;
    }
    public long getPerformerId() {
        return performerId;
    }
    public void setPerformerId(long performerId) {
        this.performerId = performerId;
    }
    public String getPerformer() {
        return performer;
    }
    public void setPerformer(String performer) {
        this.performer = performer;
    }
    public String getPerformerType() {
        return performerType;
    }
    public void setPerformerType(String performerType) {
        this.performerType = performerType;
    }
    public int getSubcategoryId() {
        return subcategoryId;
    }
    public void setSubcategoryId(int subcategoryId) {
        this.subcategoryId = subcategoryId;
    }
    public String getUrlCategoryName() {
        return urlCategoryName;
    }
    public void setUrlCategoryName(String urlCategoryName) {
        this.urlCategoryName = urlCategoryName;
    }
    public String getMetaTitle() {
        return metaTitle;
    }
    public void setMetaTitle(String metaTitle) {
        this.metaTitle = metaTitle;
    }
    public String getMetaDescription() {
        return metaDescription;
    }
    public void setMetaDescription(String metaDescription) {
        this.metaDescription = metaDescription;
    }
    public String getPrimeSportUrl() {
        return primeSportUrl;
    }
    public void setPrimeSportUrl(String primeSportUrl) {
        this.primeSportUrl = primeSportUrl;
    }
    public String getSectionWiseView() {
        return sectionWiseView;
    }
    public void setSectionWiseView(String sectionWiseView) {
        this.sectionWiseView = sectionWiseView;
    }
    public String getVenueCity() {
        return venueCity;
    }
    public void setVenueCity(String venueCity) {
        this.venueCity = venueCity;
    }
    public String getVenueState() {
        return venueState;
    }
    public void setVenueState(String venueState) {
        this.venueState = venueState;
    }
    public String getSnippetDate() {
        return snippetDate;
    }
    public void setSnippetDate(String snippetDate) {
        this.snippetDate = snippetDate;
    }
    public int getEiProductionId() {
        return eiProductionId;
    }
    public void setEiProductionId(int eiProductionId) {
        this.eiProductionId = eiProductionId;
    }
    public boolean isRequireBillingAsShipping() {
        return requireBillingAsShipping;
    }
    public void setRequireBillingAsShipping(boolean requireBillingAsShipping) {
        this.requireBillingAsShipping = requireBillingAsShipping;
    }

}

部分反應

[{
"EventId":1000250537,
"Name":"US Open Golf",
"SubTitle":null,
"Description":"US Open Golf Tickets",
"Date":"\/Date(1434873560000)\/",
"LocalDate":"6/20/2015 11:59 PM",
"LocalDateFrom":null,
"ImageUrl":null,
"VenueId":146566,
"Venue":"Chambers Bay Golf Course",
"AvailableTickets":33,
"PerformerId":151551,
"Performer":"US Open Golf",
"PerformerType":"Golf",
"SubcategoryId":55,
"UrlCategoryName":"Sports",
"MetaTitle":null,
"MetaDescription":null,
"PrimeSportUrl":"http://primesport.sieenasoftware.com/e/sports/us-open-golf/chambers-bay-golf-course/",
"SectionWiseView":null,
"VenueCity":"UNIVERSITY PLACE",
"VenueState":"WA",
"SnippetDate":null,
"EIProductionId":99985,
"RequireBillingAsShipping":false},
{
"EventId":1000253479,
"Name":"Womens College World Series",
"SubTitle":null,
"Description": .....

UPDATE

我知道JAXB可以同時用於JSON和XML,我正在嘗試使用它來查看它是否有助於解決問題。

UPDATE

該代碼返回以下異常:

    org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.myproject.myevent.Results out of START_ARRAY token
 at [Source: java.io.PushbackInputStream@dedcd10; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.myproject.myevent.Results out of START_ARRAY token
 at [Source: java.io.PushbackInputStream@dedcd10; line: 1, column: 1]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:208)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:200)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:97)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:809)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:793)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:576)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:529)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:261)
    at com.myproject.service.TicketSeviceImpl.primeSport(TicketSeviceImpl.java:217)
    at com.myproject.service.TicketSeviceImpl.findTicket(TicketSeviceImpl.java:45)
    at com.myproject.web.TicketController.findTicket(TicketController.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)

UPDATE

以下代碼返回

try {
            System.err.println(">>> primeSport");
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(
                    new MappingJackson2HttpMessageConverter());
            ResponseEntity<Event[]> responseEntity = restTemplate
                    .getForEntity(
                            "http://primesport.sieenasoftware.com/QryApi/GetEvents?username=username&password=password&userid=23",
                            Event[].class);
            System.err.println(">>" + responseEntity.getBody().length);
            System.err.println(">>" + responseEntity.getBody()[0].getEventId());
            System.err.println(">>" + responseEntity.getBody()[1].getEventId());
        } catch (Exception e) {
            e.printStackTrace();
        }

產量

>1532
>0
>0

您可以嘗試以下方法,看看是否有幫助:

ResponseEntity<Events[]> responseEntity = restTemplate
            .getForEntity(
                    "http://primesport.sieenasoftware.com/QryApi
                     /GetEvents?
                     username=username&
                     password=password&
                     userid=23",
                     Events[].class);
System.err.println(">>" + responseEntity.getBody().length);

為了將字段映射到JSON成員,您可以使用Jackson注釋JSONProperty("EventId")可以用於eventId字段。 其他人也一樣。

@JsonProperty("EventId")
private long eventId;
@JsonProperty("Name")
private String name;

您是否嘗試查看生成了確切的請求? 假設在諸如Fiddler / Charles之類的代理軟件中?

有時,我經歷過,在請求真正到達網絡(或到達服務器端點)之前,框架添加了其他構造(編碼等)。

試試這個,創建請求。 即使是RestTemplate的文檔也建議避免對URL進行雙重編碼。 在IDE中查看時,可能不太明顯。

String url = "http://primesport.sieenasoftware.com/QryApi/GetEvents?";
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("username", "username");
params.add("password", "password");
params.add("userid", "23");

UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(url).queryParams(params).build();
System.out.println(uriComponents.toUri());

請讓我知道結果如何。

另外,如果您找不到設置提琴手代理的步驟,請告知。 在對服務客戶端進行編碼時,這是一個非常方便的工具。

根據json格式,您只需要使用Event類而不是Result類。 或將JSON結果更改為此:

["events": {
"EventId":1000250537,
"Name":"US Open Golf",
"SubTitle":null,
"Description":"US Open Golf Tickets",
"Date":"\/Date(1434873560000)\/",
"LocalDate":"6/20/2015 11:59 PM",
"LocalDateFrom":null,
"ImageUrl":null,
"VenueId":146566,
"Venue":"Chambers Bay Golf Course",
"AvailableTickets":33,
"PerformerId":151551,
"Performer":"US Open Golf",
"PerformerType":"Golf",
"SubcategoryId":55,
"UrlCategoryName":"Sports",
"MetaTitle":null,
"MetaDescription":null,
"PrimeSportUrl":"http://primesport.sieenasoftware.com/e/sports/us-open-golf/chambers-bay-golf-course/",
"SectionWiseView":null,
"VenueCity":"UNIVERSITY PLACE",
"VenueState":"WA",
"SnippetDate":null,
"EIProductionId":99985,
"RequireBillingAsShipping":false},
{
"EventId":1000253479,
"Name":"Womens College World Series",
"SubTitle":null,
"Description": .....

如果您使用的是Maven,則可以嘗試導入Jackson Jar或在pom.xml中添加依賴項。

ObjectMapper mapper = new ObjectMapper();
      try
      {
         mapper.writeValue(new File("c://temp/employee.json"), Results);
      }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM