java fastjson传输long数据却接收到了int的问题

 更新时间:2022年01月13日 17:04:18   作者:潇潇云起  
这篇文章主要介绍了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)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于MyBatis XML配置方法(全面了解)

    基于MyBatis XML配置方法(全面了解)

    下面小编就为大家带来一篇基于MyBatis XML配置方法(全面了解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Kotlin 基本语法实例详解

    Kotlin 基本语法实例详解

    这篇文章主要介绍了Kotlin 基本语法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • java参数传递之值传递和引用传递

    java参数传递之值传递和引用传递

    这篇文章主要介绍了java参数传递之值传递和引用传递,引用了两个代码实例来讲解,有感兴趣的同学可以研究下
    2021-02-02
  • 使用SpringBoot设置虚拟路径映射绝对路径

    使用SpringBoot设置虚拟路径映射绝对路径

    这篇文章主要介绍了使用SpringBoot设置虚拟路径映射绝对路径的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MyBatis 超详细讲解动态SQL的实现

    MyBatis 超详细讲解动态SQL的实现

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦
    2022-03-03
  • Java实现解析ini文件对应到JavaBean中

    Java实现解析ini文件对应到JavaBean中

    ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式。这篇文章主要介绍了通过Java实现解析ini文件对应到JavaBean中,需要的可以参考一下
    2022-01-01
  • Java中new Date().getTime()指定时区的时间戳问题小结

    Java中new Date().getTime()指定时区的时间戳问题小结

    本文主要介绍了Java中new Date().getTime()时间戳问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java代理模式与动态代理模式详解

    java代理模式与动态代理模式详解

    代理就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用
    2014-02-02
  • Java算法之数组冒泡排序代码实例讲解

    Java算法之数组冒泡排序代码实例讲解

    这篇文章主要介绍了Java算法之数组冒泡排序代码实例讲解,文中用代码举例讲解的很清晰,有感兴趣的同学可以研究下
    2021-03-03
  • Java模拟有序链表数据结构的示例

    Java模拟有序链表数据结构的示例

    这篇文章主要介绍了Java模拟有序链表数据结构的示例,包括一个反序的单链表结构的例子,需要的朋友可以参考下
    2016-04-04

最新评论