java fastjson傳輸long數據卻接收到瞭int的問題

fastjson傳輸long數據卻接收到瞭int

最近在java開發中發現一個有趣現象,在網元A中的一個vo裡有個類型為Long的taskId字段,用fastjson將其轉為json字符串,用http請求傳給網元B,網元B用一個map接收該實體,接收到後卻發taskID其數據類型為Integer,如下圖一所示。

圖一

此時如果用long taskId= (long) reqMap.get("taskId");保存字段就會報如下錯誤java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long如果taskId大於整型范圍,那會是什麼場景呢?筆者做瞭如下嘗試,首先查詢出Integer.MAX_VALUE的值為2147483647,然後將taskId的值設置為比它大的3147483647,發現網元B接受到的數據類型為Long,如圖二所示。

圖二

那麼後端我們怎麼接受這個數據呢,筆者想到瞭Integer和Long的父類,查看發現她有public abstract int intValue();public abstract long longValue();,故思考可否先用父類接受再用longValue轉為long類型呢?後測試可行,結果見圖三。

圖三

小結一下:對於long 類型可以先用Number接收,然後再抓為long,Number b = (Number) reqMap.get("taskId"); taskId =b.longValue();

使用FastJson做數據類型轉換

因為工作中會經常用到json數據和對象,集合,map,以及字符串之間的轉換,因此做好一個總結

引入一個fastjosn的依賴

             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>fastjson</artifactId>
                 <version>1.2.47</version>
             </dependency>

Java:

數據轉化為JSON

Note:

  由於scala的集合和Map不同於JAVA,因此此處使用java做對象轉為json的案例,如有需要,可以封裝對應的方法,然後使用scala調用即可

1) 將對象轉化為json:

寫一個user類,作為對象轉化為json案例:

package entity;
public class user {
 
    private Integer id ;
    private String username ;
    private String password;
  public void setId(Integer id) {
        this.id = id;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getId() {
        return id;
    }
    public String getUsername() {
        return username;
    }
    public String getPassword() {
        return password;
    }
    @Override
    public String toString() {
        return "user{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

將對象放在Map中轉化為json:

package service.impl;
import com.alibaba.fastjson.JSON;
import entity.user;
import java.util.HashMap;
import java.util.Map;
public class MapToJson {
    public static void main(String[] args) {
        user us = new user();
        us.setId(1);
        us.setUsername("lisa");
        us.setPassword("110");
        user u2 = new user();
        u2.setId(2);
        u2.setUsername("julian");
        u2.setPassword("120");
        
        /**
         * Map轉為JSON
         */
        Map<String, user> maps = new HashMap<String, user>();
        maps.put("1", us);
        maps.put("2", u2);
        System.out.println("maps = " + JSON.toJSONString(maps));        
    }
}

獲得結果:

maps = {"1":{"id":1,"password":"110","username":"lisa"},"2":{"id":2,"password":"120","username":"julian"}}

2) 將字符串轉化為json

將字符串轉化為json,因為在數據處理中使用語言為 scala,因此使用scala作為案例:

 /**
     * 二. 將字符串轉為json
     */
    case class student(
                       id:Int,
                       name:String
                      )
    var maps=Map[String,student]()
     val stu1=student(1,"lisa")
     val stu2=student(2,"july")
    maps+=("1"->stu1)
    maps+=("2"->stu2)
   val result2: String = JSON.toJSONString(maps,SerializerFeature.PrettyFormat)
println(result2)

結果:{"rule1":"kasa","rule2":"uzi"}

將json數據解析

 /**
     *   一.  將json數據解析,獲得具體的值
     */
解析多層嵌套數據:
     val str = "{\"error\":200,\"msg\":null,\"tianji_api_agentn_fenqiscorev10_response\":{\"tags\":{\"150\":0,\"151\":0,\"152\":0,\"153\":0,\"154\":0,\"110\":0,\"111\":0,\"112\":1,\"113\":0,\"114\":0,\"115\":0,\"116\":0,\"117\":0,\"118\":0,\"119\":3,\"161\":3,\"162\":1,\"120\":0,\"121\":5,\"122\":0,\"123\":0,\"124\":0,\"125\":2,\"5\":\"android\",\"126\":0,\"127\":4,\"128\":0,\"129\":0,\"130\":0,\"131\":0,\"132\":0,\"133\":0,\"134\":0,\"135\":0,\"136\":0,\"137\":0,\"138\":0,\"139\":0,\"140\":3,\"141\":0,\"142\":5,\"143\":3,\"144\":0,\"101\":0,\"145\":6,\"102\":1,\"146\":0,\"103\":1,\"147\":0,\"148\":0,\"104\":0,\"149\":0,\"105\":3,\"106\":5,\"107\":0,\"108\":2,\"109\":2,\"credit_score\":457},\"biz_id\":\"2589e393-004d-4b37-b0ab-23455c4bbde2\",\"req_id\":\"15422508480665693989\"},\"request_id\":\"15422508480517778031\"}"
    //將字符串轉為jsonobject
    val json: JSONObject =JSON.parseObject(str)
    //根據key獲得值並獲得一個jsonobject
    val tj: JSONObject =json.getJSONObject("tianji_api_agentn_fenqiscorev10_response")
    //根據上一個jsonobject獲得對應key的value
    val tag=tj.getJSONObject("tags")
    //獲取多級嵌套json的具體key的value
    val result=tag.getString("150")
    println(result)

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: