如何解决JAVA中的JSON格式问题?

如何解决JAVA中的JSON格式问题?,java,json,hibernate,spring-boot,Java,Json,Hibernate,Spring Boot,这是我在JavaSpring中的第一个项目。所以我想找出做事情的最好方法 我的项目中有几个RESTAPI,将为它们发送不同类型的API响应 在某个地方我以列表格式获取数据,在另一个地方获取另一种格式的数据。所以我试图找出以JSON格式发送响应的最佳方式 我得到的API响应之一是: { "result": "true", "message": null, "data": "{\"id\":1,\"firstName\":\"test\",\"lastName\":\"test\",\"emailI

这是我在JavaSpring中的第一个项目。所以我想找出做事情的最好方法

我的项目中有几个RESTAPI,将为它们发送不同类型的API响应

在某个地方我以列表格式获取数据,在另一个地方获取另一种格式的数据。所以我试图找出以JSON格式发送响应的最佳方式

我得到的API响应之一是:

{
"result": "true",
"message": null,
"data": "{\"id\":1,\"firstName\":\"test\",\"lastName\":\"test\",\"emailId\":\"test@test.com\",\"mobileNo\":\"1234567890\",\"alternateMobileNo\":\"1234567890\",\"username\":\"test\",\"password\":\"7c4a8d09ca3762af61e59520943dc26494f8941b\",\"status\":\"active\",\"userRole\":\"test\",\"dateCreated\":\"Feb 6, 2019\",\"permissions\":\"\"}"
}
我最大的问题是上面JSON中数据键的格式

这是我的控制器操作:

@RequestMapping(value = "/admin/staff/get", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public Map get(HttpServletRequest request, @RequestParam Map<String, String> parameters) {
    Map<String, String> response = new HashMap<>();
    Gson gson = new Gson();
    Staff staff = new Staff();

    staff.setId(new Integer(parameters.get("id")));

    List validateToken = loginAuthTokenService.validateToken(new Integer(request.getHeader("loginId")), request.getHeader("loginType"), request.getHeader("token"));
    if (validateToken.size() > 0) {
        Staff staffDetails = staffService.getStaff(staff.getId());
        response.put("result", "true");
        response.put("data", gson.toJson(staffDetails));
    } else {
        response.put("result", "false");
        response.put("message", "No records found.");
    }
    return response;
}
@RequestMapping(value=“/admin/staff/get”,method=RequestMethod.POST,consumes=MediaType.APPLICATION\u FORM\u URLENCODED\u value)
公共映射获取(HttpServletRequest请求,@RequestParam映射参数){
Map response=newhashmap();
Gson Gson=新的Gson();
职员=新职员();
setId(新的整数(parameters.get(“id”));
List validateToken=loginAuthTokenService.validateToken(新整数(request.getHeader(“loginId”)、request.getHeader(“loginType”)、request.getHeader(“token”);
如果(validateToken.size()>0){
Staff staffDetails=staffService.getStaff(Staff.getId());
回答。放置(“结果”、“真实”);
response.put(“data”,gson.toJson(staffDetails));
}否则{
回复。放置(“结果”、“错误”);
响应。放置(“消息”,“未找到记录”);
}
返回响应;
}
我是否应该创建一个单独的类来发送API响应,或者任何人请指导我发送响应的正确方式

谢谢

Gson#toJson(Object)
返回一个字符串,该字符串在映射中映射为JSON键

您不必将对象转换为JSON,Spring将为您执行此操作(它使用Jackson作为JSON映射器,因此您不必向项目中添加Gson依赖项)

一个简单有效的实现可以是:

@RequestMapping(value = "/admin/staff/get", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity<?> get(
        @RequestParam("id") Integer id,
        @RequestHeader("loginId") Integer loginId,
        @RequestHeader("loginType") String loginType, 
        @RequestHeader("token") String token) {

    List validateToken = loginAuthTokenService.validateToken(loginId, loginType, token);
    if (!validateToken.isEmpty()) {
        Stuff stuff = staffService.getStaff(id);
        return ResponseEntity.ok(stuff);
    }

    return ResponseEntity.notFound().body("No records found.");
}
@RequestMapping(value=“/admin/staff/get”,method=RequestMethod.POST,consumes=MediaType.APPLICATION\u FORM\u URLENCODED\u value)
公众的反应(
@RequestParam(“id”)整数id,
@RequestHeader(“loginId”)整数loginId,
@RequestHeader(“登录类型”)字符串登录类型,
@RequestHeader(“令牌”)字符串(令牌){
List validateToken=loginAuthTokenService.validateToken(loginId,loginType,token);
如果(!validateToken.isEmpty()){
Stuff=staffService.getStaff(id);
返回应答。ok(东西);
}
返回ResponseEntity.notFound().body(“未找到任何记录”);
}

也考虑不要从方法返回一个通用的映射,但是 Tuffs<代码>对象你的前端需要。在失败的情况下,你应该返回一个带有特定HTTP响应代码的失败对象(例如404, 400, 500…)。


查看。

要格式化数据属性,可以将其存储在地图中:-

Map<String, Object> map1= new HashMap<String, Object>();
Map map1=newhashmap();
如果您有多个数据属性,则可以创建地图的ArrayList:-

ArrayList<Map<String, Object>> dataClerk = new ArrayList<Map<String,Object>>();
ArrayList dataClerk=new ArrayList();
我有一个类似的usecas,所以我使用了以下代码:-

obj = parser.parse(response);
JSONObject jobj = (JSONObject)parser.parse(response); 
JSONArray jsonarr_1 = (JSONArray) jobj.get(item);
for(int i=0 ;i<jsonarr_1.size();i++) {
        Map<String, Object> entry = new HashMap<String, Object>();
        org.json.simple.JSONObject temp= (org.json.simple.JSONObject) 
        jsonarr_1.get(i);
        Set<String> attributes= temp.keySet();
        for(String s: attributes) {
                entry.put(s, temp.get(s));
             }

    }
obj=parser.parse(响应);
JSONObject jobj=(JSONObject)parser.parse(response);
JSONArray jsonarr_1=(JSONArray)jobj.get(item);

对于(int i=0;ii如果我要这样做,我将如何发送响应。put(“result”,“true”);因为“true”不是对象?
“true”
是字符串,字符串是对象。顺便说一句,看看我上次对答案的编辑。我明白了,但是@ResponseStatus(value=HttpStatus.OK)我将不得不使用上面的函数,如何根据可用数据发送不同类型的响应,或者与我做的对/错不同?返回一个带有正确http代码的响应,或者在方法中抛出一个异常,并使用ControllerAdvise来处理,如链接指南所述(这里有很多指南,我刚刚在谷歌上找到的第一个链接就是你)这里,可能更好