以下是我编写的代码。
@RequestMapping(value = "/getData", method = RequestMethod.GET)
public @ResponseBody Map<String,String> test() throws IOException {
Map<String,String> map = new HashMap<String,String>();
map.put("key","value");
map.put(null, "Key's Value"); //**This highlighted code causing the problem, if I remove this then it works fine.**
return map;
}
当我点击网址localhost:8080/myapp/getData
时
我收到以下回复
10.5.1 500内部服务器错误 服务器遇到意外情况,导致无法完成请求。
即使Spring也不打印任何服务器端异常!
我想知道Spring无法处理JSON响应的根本原因,其中key为null。
答案 0 :(得分:2)
如果你想要一个空键,请按照
进行操作http://www.baeldung.com/jackson-map-null-values-or-null-key
class MyDtoNullKeySerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException, JsonProcessingException {
jsonGenerator.writeFieldName("");
}
}
@Test
public void givenAllowingMapObjectWithNullKey_whenWriting_thenCorrect() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializerProvider().setNullKeySerializer(new MyDtoNullKeySerializer());
MyDto dtoObject = new MyDto();
dtoObject.setStringValue("dtoObjectString");
Map<String, MyDto> dtoMap = new HashMap<String, MyDto>();
dtoMap.put(null, dtoObject);
String dtoMapAsString = mapper.writeValueAsString(dtoMap);
assertThat(dtoMapAsString, containsString("\"\""));
assertThat(dtoMapAsString, containsString("dtoObjectString"));
}
答案 1 :(得分:1)
JSON对象键必须是符合规范的字符串。因此,不允许null
作为JSON对象键。因此失败的原因是因为您返回的内容无法序列化为有效的JSON结构。
然而,Jackson允许您使用自定义序列化程序,您可以创建一个处理null
键的序列化程序。 dom farr的回答描述了如何做到这一点。
答案 2 :(得分:0)
{{1}}
默认情况下,Jackson不允许使用null键序列化Map。如果您有任何疑问,请参阅本网站。 http://www.baeldung.com/jackson-map-null-values-or-null-key