首页 > 解决方案 > Spring加载JSON文件并通过requestMapping返回

问题描述

我正在尝试从课程路径加载一个简单的 json 文件,并通过 Spring 返回我正在组装的测试服务器。

该文件正在加载。这不是问题。问题是让 Spring 通过 api 将文件内容作为 JSON 发送。

 @RequestMapping(path = "/courses", method = GET)
 public JSONObject getCourses() throws IOException {


Resource resource = resourceLoader.getResource("classpath:samples/course.json");

InputStream resourceInputStream = resource.getInputStream();



if (resourceInputStream == null) {
    throw new NullPointerException("Cannot find resource file " + resource);
}

final JSONTokener tokener = new JSONTokener(resourceInputStream);
return new JSONObject(tokener);

}

但我只是从端点返回 {empty:false} 。

知道我如何发送那个json吗?

标签: javaspringspring-boot

解决方案


当您使用 Spring Web 框架时,为什么不使用 jackson 进行 json 处理。你可以这样尝试:

@Autowired
ObjectMapper objectMapper;

@Autowired
ResourceLoader resourceLoader;

@GetMapping("/test")
public JsonNode test() throws IOException {
    JsonNode node = objectMapper.readValue(resourceLoader.getResource("classpath:/samples/course.json").getURL(), JsonNode.class);
    return node;
}

我的测试结果:

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = [{"course":"course1"},{"course":"course1"},{"course":"course1"},{"course":"course1"}]
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

编辑解释为什么 JSONObject 返回 {empty:false}

用于 json 处理的 Spring 使用 jackson 库。这个库不知道什么是 java org.json.JSONObject。所以它把它当作简单的 POJO 来处理,可以用常见的规则/符号进行序列化。jackson 在 JSONObject 中找到方法 isEmpty() ,并且该方法的命名看起来像 POJO getter 返回其值。如果您希望杰克逊正确处理 org.json.* 类,您可以使用以下特殊模块:

https://github.com/FasterXML/jackson-datatype-json-org

objectmapper并用你的bean注册这个模块 :

   @Bean
    Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer( ){
        return jacksonObjectMapperBuilder -> {
            jacksonObjectMapperBuilder.modules(new JsonOrgModule());
        };
    }

在此更改后,您的 orj.json.* 对象应按预期序列化。

附言

jackson 可以将 map 序列化为 json,因此您也可以将 JSONOBject 转换为 map。jsonObject.toMap()并返回。这种方式不需要额外的模块。


推荐阅读