javabean与json转换(fastjson与jackson两个版本)

【README】

本文演示了 javabean与json转换的开发方式;

要想 javabean的属性名 与 json的字段名不一致,也是可以转换的;

之前需要引入 ali.fastjson

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

【1】javabean与fastjson互转

对于 perons, 需求是属性id 转换为 json字符串后,其字段名为 myid;

public class FastPerson {@JSONField(name="myid") // bean属性id的别名为myidprivate int id;@JSONField(name="name")private String name;@JSONField(serialize = false) // bean的city属性不转为json字符串private String city;@JSONField(deserialize = false) // json字符串的addr字段不解析到bean的addr属性private String addr;// 不进行序列化与反序列化(transient对 fastjson有效)private transient String dontTrans;public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public void setCity(String city) {this.city = city;}public void setAddr(String addr) {this.addr = addr;}public int getId() {return id;}public String getName() {return name;}public String getCity() {return city;}public String getAddr() {return addr;}public String getDontTrans() {return dontTrans;}public void setDontTrans(String dontTrans) {this.dontTrans = dontTrans;}@Overridepublic String toString() {return "FastPerson{" +"id=" + id +", name='" + name + '\'' +", city='" + city + '\'' +", addr='" + addr + '\'' +", dontTrans1='" + dontTrans + '\'' +'}';}
}

转换测试用例;

public class FastJsonDemo {public static void main(String[] args) {FastPerson person2 = new FastPerson();person2.setId(1);person2.setName("zhangsan");person2.setAddr("gaoxinqu");person2.setCity("cd");person2.setDontTrans("dont");// bean 转json字符串String jsonstr2 = JSON.toJSONString(person2);System.out.println(jsonstr2);// json字符串转beanFastPerson p2 = JSON.parseObject(jsonstr2, FastPerson.class);System.out.println(p2);}
}

打印结果;

{"addr":"gaoxinqu","myid":1,"name":"zhangsan"}
Person2{id=1, name='zhangsan', city='null', addr='null', dontTrans1='null'}

【补充】

  • @JSONField(name="myid") 注解用于定义javabean属性的别名,即转为json字符串之后的字段名;
  • @JSONField(serialize = false)   bean的city属性不转为json字符串(不进行序列化)
  • @JSONField(deserialize = false)  json字符串的addr字段不解析到bean的addr属性(不进行反序列化)
  • transient 用于表示该字段不进行序列化与反序列化; 
  • 需要转换json的bean,必须要有 getter 和 setter 方法

【2】javabean与jackson互转

添加maven依赖;

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

jackson测试的javabean; 

public class JacksonPerson {@JsonProperty("myid") // bean属性id的别名为myidprivate int id;@JsonProperty("name")private String name;@JsonIgnore // bean的city属性不转为json字符串private String city;@JsonIgnore // json字符串的addr字段不解析到bean的addr属性private String addr;// transient 对 jackson 无效, 即jackson还是会序列化与反序列化 dontTrans 属性private transient String dontTrans;public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public void setCity(String city) {this.city = city;}public void setAddr(String addr) {this.addr = addr;}public int getId() {return id;}public String getName() {return name;}public String getCity() {return city;}public String getAddr() {return addr;}public String getDontTrans() {return dontTrans;}public void setDontTrans(String dontTrans) {this.dontTrans = dontTrans;}@Overridepublic String toString() {return "JacksonPerson{" +"id=" + id +", name='" + name + '\'' +", city='" + city + '\'' +", addr='" + addr + '\'' +", dontTrans1='" + dontTrans + '\'' +'}';}
}

jackson测试用例:

public class JacksonDemo {public static void main(String[] args) {JacksonPerson jacksonPerson = new JacksonPerson();jacksonPerson.setId(1);jacksonPerson.setName("zhangsan");jacksonPerson.setAddr("gaoxinqu");jacksonPerson.setCity("cd");jacksonPerson.setDontTrans("dont");// bean 转json字符串String jacksonStr = JacksonUtils.beanToJson(jacksonPerson);System.out.println(jacksonStr);// json字符串转beanJacksonPerson p2 = JacksonUtils.jsonToBean(jacksonStr, JacksonPerson.class);System.out.println(p2);}
}// jackson 工具
public class JacksonUtils {private JacksonUtils(){}private static ObjectMapper objectMapper;static {objectMapper = new ObjectMapper();}//bean转换为json字符串public static String beanToJson(Object bean) {String jsonStr = "";try {jsonStr = objectMapper.writeValueAsString(bean);} catch (JsonProcessingException e) {e.printStackTrace();}return jsonStr;}//map转换为json字符串public static String mapToJson(Map<String, Object> map) {String jsonStr = "";try {jsonStr = objectMapper.writeValueAsString(map);} catch (JsonProcessingException e) {e.printStackTrace();}return jsonStr;}//list转换为json字符串public static String listToJson(List<Object> list) {String jsonStr = "";try {jsonStr = objectMapper.writeValueAsString(list);} catch (JsonProcessingException e) {e.printStackTrace();}return jsonStr;}//json字符串转换为beanpublic static <T> T jsonToBean(String jsonStr, Class<T> clazz) {T bean = null;try {bean = objectMapper.readValue(jsonStr, clazz);} catch (IOException e) {e.printStackTrace();}return bean;}//json字符串转换为listpublic static <T> List<T> jsonToList(String jsonStr, Class<T> clazz) {List list = null;try {list = (List) objectMapper.readValue(jsonStr, clazz);} catch (IOException e) {e.printStackTrace();}return list;}//json字符串转换为mappublic static Map jsonToMap(String jsonStr, Class<?> clazz) {Map map = null;try {map = (Map) objectMapper.readValue(jsonStr, clazz);} catch (IOException e) {e.printStackTrace();}return map;}
}

打印结果:

{"dontTrans":"dont","myid":1,"name":"zhangsan"}
JacksonPerson{id=1, name='zhangsan', city='null', addr='null', dontTrans1='dont'}

显然, transient 对 jackson 无效,即  即jackson还是会序列化与反序列化 dontTrans 属性;


【2】fastjson 与 jackson 区别

【2.1】fastjson

是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架; 字符串解析成JavaBean时,当数据量较少时首选fastjson;字符串解析成JSON时,当数据量较少时首选fastjson

例子:

//将对象或List转为json字符串或json数组
JSON.toJSONString(obj);
//将json字符串和json数组转为对象或list
JSON.toJSON(jsonStr)

【2.2】jackson

是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”;字符串解析成JavaBean时,数据量较大使用jackson;字符串解析成JSON时,数据量较大使用jackson

//首先要先定义一个Mapper
ObjectMapper mapper = new ObjectMapper();
//将对象或List转为json字符串或json数组
mapper.writeValueAsString(obj);
//将json字符串和json数组转为对象或list
mapper.readValue(jsonStr, Class);

补充: 数据量是多少算较少,算较大 ?

本文仅给出一个经验值 100w,但具体要在本地做性能测试才可以计算出来;

补充:两者性能测试 refer2

[享学Jackson] 二十二、Jackson与Fastjson的恩怨情仇(完结篇)【附源码】_YourBatman_51CTO博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

概述今天主要分享一个最近做的实验&#xff0c;主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现。MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。RR能提供SQL语句的写可串行化&#xff0c;保证了绝大部分情况(不安全语句除外)的DB/DR一致。下面以my…

直面Java第45期

转载自 直面Java第45期

ABP框架搭建项目系列教程基础版

我现在要着手一个新的项目&#xff0c;也打算用这个框架&#xff0c;所以想要将我一步一步用这个框架的做项目的步骤和想法跟大家分享出来。 经过前面十二篇的基础教程&#xff0c;现在终于该做个总结了。 第一篇&#xff0c;我们建议新手朋友们先通过ABP官网的启动模板生成解决…

字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)

【README】 本文po出了 如何读取 字节数组到jsonobject&#xff1b; 字节数组如何获取&#xff0c;本文不再赘述&#xff1b; 【1】代码 /*** Description 字节数组转json演示* author xiao tang* version 1.0.0* createTime 2022年02月11日*/ public class ByteArr2JsonDem…

sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南

我们往往在谈论zabbix的优缺点的时候&#xff0c;提到最多的依然还是数据库(默认采用关系型数据库)&#xff0c;由于关系型数据库所有的读写都是采用sql语句解析&#xff0c;一但并发过大或者数据量过大&#xff0c;处理能力就显得捉襟见肘&#xff0c;这也是Zabbix让人诟病的地…

对象并不一定都是在堆上分配内存的

转载自 对象并不一定都是在堆上分配内存的 JVM内存分配策略 关于JVM的内存结构及内存分配方式&#xff0c;不是本文的重点&#xff0c;这里只做简单回顾。以下是我们知道的一些常识&#xff1a; 1、根据Java虚拟机规范&#xff0c;Java虚拟机所管理的内存包括方法区、虚拟机栈、…

Bash on Windows 抢鲜测试 -- 介绍及安装

前言 微软在上周的Windows BUILD大会上宣布&#xff0c;WIN10将引入原生Bash&#xff0c;并将很快在技术预览版中推出。 如此一来&#xff0c;windows的命令行工具就不再只有cmd和powershell了&#xff0c;我们可以还可以使用bash。 今天&#xff08;2016/4/8&#xff09;收到了…

jvm的client与server工作模式

【README】 JVM Server模式与client模式启动&#xff0c;最主要的差别在于&#xff1a; -Server模式启动时&#xff0c;速度较慢&#xff0c;但是一旦运行起来后&#xff0c;性能将会有很大的提升. 原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译…

python重定向到socket_python套接字流重定向实例汇总

#!/usr/bin/env python3"""测试socket-stream 重定向模式"""import sys,os,timefrom multiprocessing import Processfrom socket import *def initListenerSocket(port50008,host):"""初始化在服务器模式下调用者用于监听连接的…

Spring Boot的自动化配置原理

转载自 Spring Boot的自动化配置原理 随着Ruby、Groovy等动态语言的流行&#xff0c;相比较之下Java的开发显得格外笨重。繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大等问题一直被人们所诟病。随着Spring家族中的新星Spring Boot的诞生&#xff0c;这…

复盘Build 2016:不要错过微软给.NET开发者的这些福利

本文作者陈计节&#xff0c;ThoughtWorks 高级咨询师。多年的跨平台 .NET 开发者&#xff0c;全栈工程师&#xff0c;技术布道师。擅长互联网应用程序的设计、开发和运维等工作。 近年来&#xff0c;微软坚持为社区提供更多灵活性&#xff0c;并以更开放的思路重构其已有平台&a…

java异步线程内存可见性实验

【README】 本文演示了内存可见性的场景&#xff0c;以及解决方法&#xff1b; 相关定义如下&#xff08;转自java并发编程实战&#xff0c;一本好书&#xff0c;强烈推荐&#xff09;&#xff1a; 内存可见性&#xff1a;一个线程修改了对象状态后&#xff0c; 其他线程可以…

springboot 单例_如何实现一个单例及优化

前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。 知识改变命运,学习成就未来。爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎 Star:。 https:// github.com/ITfqyd/cxyxs 社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间…

乐观锁的一种实现方式——CAS

转载自 乐观锁的一种实现方式——CAS在深入理解乐观锁与悲观锁一文中我们介绍过锁。本文在这篇文章的基础上&#xff0c;深入分析一下乐观锁的实现机制&#xff0c;介绍什么是CAS、CAS的应用以及CAS存在的问题等。线程安全 众所周知&#xff0c;Java是多线程的。但是&#xff0…

熬夜并不值得程序员炫耀

许多程序嘴上经常挂着每天加班到凌晨三点的论调&#xff0c;但事实上这没什么值得炫耀的&#xff0c;加班通常都是效率低的代名词。 放弃睡眠就像是高利贷借款。没错&#xff0c;看上去你是得到了额外的时间&#xff0c;但你想得太乐观了&#xff0c;你知道代价是什么吗&#x…

前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?

背景最近公司项目不多&#xff0c;比较清闲&#xff0c;划水摸鱼混迹于各大技术博客平台&#xff0c;瞬间又GET了好多前端技能&#xff0c;一些属于技巧&#xff0c;一些则是闻所未闻的冷知识&#xff0c;一时间还消化不过来&#xff0c;不由的发出一声感叹&#xff01;前端可真…

(转-这篇文章非常棒) Thread的中断机制(interrupt)

转自&#xff1a; Thread的中断机制(interrupt)-这篇文章非常棒 Thread的中断机制(interrupt) - 寂静沙滩 - 博客园先看收集了别人的文章&#xff0c;全面的了解下java的中断&#xff1a;中断线程线程的thread.interrupt()方法是中断线程&#xff0c;将会设置该线程的中断状态…

深入理解乐观锁与悲观锁

转载自 [初级]深入理解乐观锁与悲观锁在数据库的锁机制中介绍过&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。 乐观并发控制(乐观锁)和悲观并发控制&a…

Z.ExtensionMethods 一个强大的开源扩展库

今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库&#xff0c;确发现只搜到跟这个真正相关的才两篇博文而已&#xff0c;我都点进去看了一下&#xff0c;也都只是提到而已&#xff0c;没有专门介绍&#xff0c;才引起我写这篇文档。 一&#xff0e; Z.E…

python isodd奇偶_Python这些位运算的妙用,绝对让你大开眼界

位运算的性能大家想必是清楚的&#xff0c;效率绝对高。相信爱好源码的同学&#xff0c;在学习阅读源码的过程中会发现不少源码使用了位运算。但是为啥在实际编程过程中应用少呢&#xff1f;想必最大的原因&#xff0c;是较为难懂。不过&#xff0c;在面试的过程中&#xff0c;…