春季加载JSON文件并通过requestMapping返回

时间:2019-12-11 03:59:22

标签: java spring spring-boot

我正在尝试从课程路径中加载一个简单的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吗?

2 个答案:

答案 0 :(得分:2)

当您使用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处理,可以使用通用规则/符号序列化。杰克逊将方法isEmpty()放入JSONObject中,并且此方法的命名看起来像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。*对象应按预期进行序列化。

P.S。

jackson可以将地图序列化为json,因此您还可以将JSONOBject转换为地图。 jsonObject.toMap(),然后返回。这样,不需要额外的模块。

答案 1 :(得分:0)

最后做了这个:

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

    Resource resource = resourceLoader.getResource("classpath:samples/" + file);

    InputStream resourceInputStream = resource.getInputStream();

    JSONTokener tokener = new JSONTokener(resourceInputStream);
    JSONObject root = new JSONObject(tokener);

    ObjectMapper m = new ObjectMapper();
    Object object = m.readValue(root.toString(), Object.class);
    return object;
}