Spring无法使用null键返回JSON响应

时间:2015-10-12 07:08:54

标签: java json spring spring-mvc

以下是我编写的代码。

@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。

3 个答案:

答案 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