【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博客