Spring 不再支持 Jackson 1 作为消息转换器实现。
So your
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
其实对于Spring来说是没有意义的。
Your
compile 'com.google.code.gson:gson:2.3.1'
会导致Spring使用GsonHttpMessageConverter
基本上,做
String json = "{\"random\":\"42\"}";
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
JsonObject
是Gson类型。 Gson 意识到了这一点,并且知道如何将 JSON 对象 json 反序列化到其中。这将正常工作并将生成JsonObject
其值为
{"random":"42"}
既然你说你得到的是空的JsonObject
,我只能假设你的类路径上有 Jackson 2。
Spring 注册 JacksonHttpMessageConverter
, MappingJackson2HttpMessageConverter
, 之前GsonHttpMessageConverter
如果两者都存在于类路径中。
对于 Jackson,Spring 基本上会反序列化您的请求主体
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonObject jsonObject = mapper.readValue(json, JsonObject.class);
你会注意到结果
{}
这是因为杰克逊对该类型一无所知JsonObject
所以它必须动态构建反序列化策略。该策略取决于 Jackson 定义为 setter 的属性(用于反序列化的上下文)或任何带有注释的属性@JsonProperty
,这显然JsonObject
没有。所以它基本上认为类型JsonObject
没有任何属性(或者可能没有出现在自定义 JSON 内容中)。因此,因为它忽略任何未知属性(这会导致它抛出异常),所以它只是返回一个新的空的JsonObject
object.
一种解决方案是从类路径中删除 Jackson 2。另一种解决方案是显式添加HttpMessageConverter
实例按您想要的顺序排列。