定制化SpringMVC返回Json字符串

在一般的情况下在Controller上加上@ResponseBody注解,并且返回是一个对象的话,Spring会自动将这个对象转换为Json字符串给调用者。但是在一些情况下返回Spring返回的Json字符串(主要是Json字符串中的key值)不符合需求(比如调用方需要返回的Json字符串中的一个key为@class,而这个属性名称在java中是不合法的),此时需要手动地来生成这个字符串

实现这个目的有以下的几种方案
1. 定义更多的ViewModel对象,此对象中的属性是符合需求的属性名称(不推荐)
2. 使用JsonObject手动组装Json字符串。这里推荐使用com.google.code.gson下的JsonObject对象,而不推荐使用org.json下的JSONObject对象具体的原因如下

(1)使用com.google.code.gson.JsonObject返在Controller中返回的Json字符串如下:

@PostMapping(value = "/casLogin")
public Object casLogin(@RequestHeader HttpHeaders httpHeaders) {

    JsonObject jsonObject = new JsonObject();
    jsonObject.addProperty("id", "admin");
    jsonObject.addProperty("username", "admin");
    #这里的key根本无法再java类中定义
    jsonObject.addProperty("@class", "org.apereo.cas.authentication.principal.SimplePrincipal");

    return jsonObject;
}

#返回Json字符串为
{
    "id": "admin",
    "username": "admin",
    "@class": "org.apereo.cas.authentication.principal.SimplePrincipal"
}

(2)使用org.json.JSONObject返回的json字符串如下

@PostMapping(value = "/casLogin")
public Object casLogin(@RequestHeader HttpHeaders httpHeaders) {

    org.json.JSONObject jsonObject = new org.json.JSONObject();
    jsonObject.put("id", "admin");
    jsonObject.put("username", "admin");
    jsonObject.put("@class", "org.apereo.cas.authentication.principal.SimplePrincipal");

    return jsonObject;
}

#返回Json字符串为,可以看到其外层多出了一层key为map的一层
{
"map": {
        "@class": "org.apereo.cas.authentication.principal.SimplePrincipal",
        "id": "admin",
        "username": "admin"
    }
}

通过以上可以看到不同的库其实都还是有细微的差别的,而这些差别只有在实际使用的时候才能察觉到。而我刚开始面对这个需求时,首先想到是替换掉Spring默认的Json字符串转换器,而如果就算是这种方式可行的话,因为修改是在项目的全局层面的,也会对之前的旧代码造成影响,因此是不可行的

猜你喜欢

转载自blog.csdn.net/LOVE____JAVA/article/details/80190910