Java 如何将JSON请求解析为FlightOfferSearch[]对象?

Java 如何将JSON请求解析为FlightOfferSearch[]对象?,java,json,spring-boot,amadeus,Java,Json,Spring Boot,Amadeus,将FlightOfferSearch的响应示例JSON传递给我的测试REST控制器时,我无法从中反序列化它: @RestController 公共类MyController{ @后期映射(“/search”) 字符串searchHandler(@RequestBody FlightOfferSearch[]FlightOfferSearch){ return flightOfferSearchs[0]。toString(); } } (在pom.xml中添加了Spring Boot Start

FlightOfferSearch
的响应示例JSON传递给我的测试REST控制器时,我无法从中反序列化它:

@RestController
公共类MyController{
@后期映射(“/search”)
字符串searchHandler(@RequestBody FlightOfferSearch[]FlightOfferSearch){
return flightOfferSearchs[0]。toString();
}
}
(在pom.xml中添加了Spring Boot Starter应用程序的最小示例,该应用程序具有“Web”依赖项和gson 2.8.5和amadeus java 4.1.0)

我在IntelliJ中得到了这个:

2020-04-20 17:05:59.392  WARN 47240 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Conflicting setter definitions for property "fixedLengthStreamingMode": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "fixedLengthStreamingMode": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params)
 at [Source: (PushbackInputStream); line: 1, column: 1]]

Process finished with exit code -1
在《邮递员》中:

"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Conflicting setter definitions for property \"fixedLengthStreamingMode\": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property \"fixedLengthStreamingMode\": java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params) vs java.net.HttpURLConnection#setFixedLengthStreamingMode(1 params)\n at [Source: (PushbackInputStream); line: 1, column: 1]"

感谢所有评论,谢谢

您可能没有为您的参数类的某些字段创建setter,但问题更深层——您处理这个问题的方式是不正确的。 Spring的
@RestController
默认情况下将传入的有效负载从JSON转换为controller方法的object参数,并将返回对象转换为JSON

除了包含默认Jackson JSON映射器的spring boot starter web,您不需要包含任何额外的依赖项

但是,即使您确实使用了
gson
,Spring仍然会以这种方式工作,只是它将使用
gson

您需要做的一切就是创建一个类,它正确地表示传入的json并将该类用作参数,它必须有一个空构造函数,如果将该对象用作请求体,则必须有setters,如果将该对象用作响应体,则必须有getter

UPD:
如果您不拥有用作控制器方法参数的对象-我建议无论如何创建自定义POJO,使用非封装的第三方库(至少被视为气味),它违反了封装并创建了与第三方库的紧密耦合。

显示该类flightOfferArchit的this类:该类似乎只声明了getter。这是否意味着如果我想使用Jackson将其转换为JSON或从JSON转换为JSON,我应该创建一个自定义子类?它不是我自己的POJO,而是。这就是这两个依赖项的来源。在这里,我只想把JSON解析成一个对象。当我试着去做相反的事情时,我遇到了一个不同的问题,这是我刚才问的。我不确定是否与这个问题有关,因为错误消息不同。为什么要使用SDK的类而不是自定义POJO?为什么不使用自定义POJO并将其转换为FlightOfferSearch on demand,以便库封装组件执行此任务,反之亦然?很抱歉,我从未在另一个线程上收到您回复的通知。我直接回答。如果您想要一个关于如何使用Gson将JSON转换为对象的示例,可以查看方法buildFlightOffersJSON