jackson 进行json与java对象转换 之一
代码无真相,为了最简单的说明,我直接上代码。
public class User {
private String name;
private Gender gender;
private List<Account> accounts;
省略get和set方法
...
}
public enum Gender {
MALE,
FEMALE
}
public class Account {
private Integer id;
private String cardId;
private BigDecimal balance;
private Date date;
省略get和set方法
...
}
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("菠萝大象");
user.setGender(Gender.MALE);
List<Account> accounts = new ArrayList<Account>();
Account account = new Account();
account.setId(1);
account.setBalance(BigDecimal.valueOf(1900.2));
account.setCardId("423335533434");
account.setDate(new Date());
accounts.add(account);
account = new Account();
account.setId(2);
account.setBalance(BigDecimal.valueOf(5000));
account.setCardId("625444548433");
account.setDate(new Date());
accounts.add(account);
user.setAccounts(accounts);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, Boolean.TRUE);
String json = mapper.writeValueAsString(user);
System.out.println("Java2Json: "+json);
user = mapper.readValue(json, User.class);
System.out.println("Json2Java: "+mapper.writeValueAsString(user));
}
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, Boolean.TRUE);这是辅助设置,控制格式化输出。 之前使用的mapper.getSerializationConfig().setXxx方法现在很多都已经被标注为@Deprecated了,因此请大家使用上面的方式处理。 SerializationConfig.Feature枚举里面还有很多其它的设置项,比如日期,比如要不要输出null值等等。其它的还有: org.codehaus.jackson.JsonGenerator.Feature.* org.codehaus.jackson.JsonParser.Feature.* 让我们来看看输出
Java2Json:{
"name" : "菠萝大象",
"gender" : "MALE",
"accounts" : [ {
"id" : 1,
"cardId" : "423335533434",
"balance" : 1900.2,
"date" : 1397542291453
}, {
"id" : 1,
"cardId" : "625444548433",
"balance" : 5000,
"date" : 1397542291453
} ]
}
Json2Java:{
"name" : "菠萝大象",
"gender" : "MALE",
"accounts" : [ {
"id" : 1,
"cardId" : "423335533434",
"balance" : 1900.2,
"date" : 1397542291453
}, {
"id" : 1,
"cardId" : "625444548433",
"balance" : 5000,
"date" : 1397542291453
} ]
}
结果,两次转换之后,打印出来的字符串应该是一样的: OK,果然结果是一致的,大家现在应该会使用jackson进行Java与Json的互相转换了吧?恩,现在再考虑一种情况,如果想将List<User>的JSON字符串反转为泛型,应该怎么做呢? 想这样:mapper.readValue(json, List<User>.class)?这可是错误的,这里的参数是Class<T> valueType,valueType是Class<T>类的对象。如上面所示User.class 就是Class<User>类的对象。因此要想获得泛型的集合类型需要通过其它办法:
ObjectMapper mapper = new ObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
return mapper.readValue(jsonStr, javaType);
}
定义一个List<User>,向里面添加两次user,先调用writeValueAsString方法打印出json,再调用readJson方法,这不仅可以转换泛型List<T>,还可以用于其它集合,比如Map<K,V>等等。
List<User> list = readJson(json, List.class, User.class);
ObjectMapper可以让对象与JSON之间相互转换,除此之外Jackson还提供了JsonGenerator 和 JsonParser 这两个类,它们可以更细粒度化。调用ObjectMapper的writeValueAsString和readValue方法, 最终还是会交给JsonGenerator 和JsonParser 去处理,对此还有疑惑的话,可以去看看这两个方法的的处理序列化与反序列源码。
jackson 进行json与java对象转换 之一的更多相关文章
- jackson 进行json与java对象转换 之三
2.测试类,没用Junit,用Main()方法输出. package test; import java.io.IOException; import java.util.ArrayList; imp ...
- jackson 进行json与java对象转换 之二
主要用于测试学习用jackson包实现json.对象.Map之间的转换. 1.准备测试用的Java类 (1)Link类 package test; /** * Description: 联系方式,被u ...
- jackson 进行json与java对象转换 之四
jackson简单使用,对象转json,json转对象,json转list POJO序列化为json字符串: 准备一个POJO: @JsonIgnoreProperties(ignoreUnkno ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- JSON 与JAVA对象之间的转换(转)
JSON与XML两者目前在数据交互方面都有很高的使用率,随着现在SOA的兴起,异构系统的整合地位相应提高,本篇文章主要介绍JSON与JAVA对象之间的相互转换. 一.对普通类型的JSON模式的转换 一 ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- JAVA对象转换JSON
1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist); String ...
- JSON与Java对象的互相转换
JSON与Java对象的互相转换 例一(单个对象进行赋值): @RequestMapping("test1.do") @ResponseBody public JSONObject ...
随机推荐
- eclipse安装hibernate插件(在线Marketplace中安装)
网上很多都是给个网址,然后在eclipse的help中new install soft中安装.每次安装还要去查找最新的地址去安装.为什么不用eclipse的marketplace直接搜索安装呢? 打开 ...
- Java 创建线程的两种方法
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- Windows 摄像头数据
1. FFmpeg获取DirectShow设备数据(摄像头,录屏) http://blog.csdn.net/leixiaohua1020/article/details/38284961 2.
- Ubuntu 中查看内核版本和系统版本的四个命令
一.查看内核版本:cat /proc/version 二.查看内核版本:uname -a 三.查看系统版本:lsb_release -a 四.查看发行版类型:cat /etc/issue
- WebServers 异步
在网上也找了一些,发现要么题目和内容不对应,明明是在Winform下异步调用,却写成在Asp.net异步调用WebService,有的调用方式在.NET3.5下不能通过,.NET3.5下取消了Begi ...
- 安装及使用webpack
Webpack 什么是webpack:现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端社区涌现出了很多好的实践方法:1.模 ...
- JAVA动态代理的全面深层理解
Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过 ...
- 编译内核时覆盖KBUILD_BUILD_USER和KBUILD_BUILD_HOST
默认情况下make kernel.img编译出来的内核在/proc/version中显示的内容是: Linux version 3.0.36+ (xxx@yyyy) (gcc version 4.6. ...
- C# GDI+编程
窗口刷新的时候,会产生Paint事件,那么我们给这个事件添加一个处理函数.然后在这个函数里画图.就能保证所画的图不被刷新掉, 它可以总是显示.Paint事件对应的委托是:public delegate ...
- 2018.7.24 Error Code
来不及解释了,写下再说 -------------------------------------------- SUCCESS = 0, RTC_SELFTEST_FAILED = 1, ...