1. 程式人生 > >Spring MVC中 Json序列化物件例項的問題和兩個辦法

Spring MVC中 Json序列化物件例項的問題和兩個辦法

情況是這樣的:

HTTP請求中,將一個類的例項直接JSON成文字,返回給客戶的端的辦法。

系統:ContOS ,IDE:intellij Spring:4.3.6 Json:1.9.13

如果要將一個類的例項直接返回給HTTP請求的客戶端,是沒辦法的。這樣做的結果是500錯誤無法識別的型別。

那麼我們一般就是要序列化了。

方法有很多我這裡介紹兩個我常用的:

一、用JSON工具序列化

二、Spring 通過ResponseBody直接返回(當然要做一點處理)

開始上車吧

類模型是像這樣的,我們要把它直接返回給客戶端:

public class DMProduct {
   
    private String protID;
    private String protName;
   
   public String getProtID(){
       return protID;
   }
   public String getProtName(){
       return protName;
   }
   
   public void setProtID(String protID){
       this.protID=protID;
   }
   public void setProtName(String protName){
       this.protName=protName;
   }
}


方法一:用JSON工具序列化:需要包為org.json(後面有加包的程式碼)

@RequestMapping(value ="/getProduct", method = RequestMethod.GET)  //請求方法和請求方式
    public @ResponseBody String getProduct() {
        DMProduct dmProduct=new DMProduct();                       //DMProduct類裡面設定ProtID,ProtName等幾個欄位
        dmProduct.setProtID("010001");
        dmProduct.setProtName("白蘿蔔");
        String result= JsonHelper.objectToJson(dmProduct).toString(); //將例項JSON 返回給HTTP客戶端,方法在下面。注意.toString()
        return result;
    }
//JSON的方法體
 public static<T> JSONObject objectToJson(T obj) {
        ObjectMapper mapper = new ObjectMapper();
        String jsonStr = "";
        try {
            jsonStr =  mapper.writeValueAsString(obj);
        }catch (Exception e){
            e.printStackTrace();
        }
        return new JSONObject(jsonStr);
    }

這種辦法很簡單,JSON的方法可以做在一個工具類裡面,呼叫就可以了。需要一個包:org.json.下面是新增這個包的方法

    <!-- https://mvnrepository.com/artifact/org.json/json-->
    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20160810</version>
    </dependency>


方法二:Spring 通過ResponseBody直接返回

這個需要的包很重要的,我先放出來。

這個包一定要,很多教程裡面沒有說到這個包,搞得我一直找不到原因

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.6</version> </dependency>

下面兩個是JSON的包,也是必須的,網上的方法都有提到這兩個包

<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-core-asl-->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.13</version>
    </dependency>

PS:maven包的查詢新增可以到這個網站上去查:點選開啟連結,在搜尋裡面找你要的包名,點開後會列出很多版本,點選你要的新的版本,可以看到這個版本詳情裡面有新增

Maven包的方法。

把包新增好之後,在Web.xml裡面上下文的配置檔案在哪裡:如

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
  </context-param>

在WEB-INF下的
mvc-dispatcher-servlet.xml檔案是上下文的配置檔案。開啟這個檔案

<mvc:annotation-driven/>  //確保有這一條,就可以了。具體原理我就不多講,要我講我也不懂,哈哈,後面會貼大神的解說。

好了,全部工具做完了。

我們再理一下:

首先新增必需的三個JSON包。

再找到上下檔案配置檔案,開啟配置檔案,新增

<mvc:annotation-driven/>
完成。

下面是請求的部分了:

@RequestMapping(value = "/getProduct2", method = RequestMethod.GET)  //一樣是客戶端的請求方法體和請求方式
    public @ResponseBody DMProduct getProduct2() {
        DMProduct dmProduct=new DMProduct();
        dmProduct.setProtID("010001");
        dmProduct.setProtName("白蘿蔔");
        return dmProduct;                                             //直接就可以返回類的例項,系統會自動幫我們序列化給客戶端
    }

現在就這麼幾下,不用寫程式碼了,現在程式設計師越來越簡單了,天不早了,希望對你有用。

另外加幾個大神的文章: