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<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作为案例:
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数据解析
解析多层嵌套数据:
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)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341