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