java - 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吗?
解决方案
当您使用 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()
并返回。这种方式不需要额外的模块。
推荐阅读
- python - 从基类中查找实例类型的 Pythonic 方法是什么?
- java - 正则表达式查找包含数字的行,以文本开头,但从出现中删除文本
- javascript - 对象中的计算值 | 苗条
- latex - 如何将 natbib \bibliographystyle{dcu} 编辑为首选格式?
- regex - java中复杂的正则表达式分隔符
- powershell - 无法在发布管道中打印 Azure-Keyvault 机密
- python - 如何将 Python dict 转换为 Class 对象
- c++ - Qt 创建者:加载位于子目录中的项目文件
- javascript - Google 表格 - 重新格式化表单提交日期
- perl - 如何在不使用 Perl 中的矩阵库的情况下对矩阵进行操作?