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 ...
随机推荐
- 最全面的linux信号量解析
信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程) 所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用, ...
- (python)循环中动态产生变量
>>> for i in xrange(5): exec 'a'+str(i)+' = '+str(i)+'' >>> a0 0 >>> a1 1 ...
- OpenStack企业私有云新需求(1):Nova 虚机支持 GPU
作者:Sammy Liu 刘世民 本系列会介绍OpenStack 企业私有云的几个需求: GPU 支持 自动扩展(Auto-scaling)支持 混合云(Hybrid cloud)支持 物理机(Bar ...
- jquery 之 Deferred 使用
Deferred是jquery的promise接口的实现.他是非同步操作的通用接口,可以看作是完成一个任务之后再执行另外一个任务. 观察者模式是开发中经常使用的模式,这个模式由两个主要部分组成:主题和 ...
- PyCharm 的初始设置1
PyCharm 的初始设置 PyCharm 的官方网站地址是:https://www.jetbrains.com/pycharm/ 01. 恢复 PyCharm 的初始设置 PyCharm 的 配置信 ...
- Composer安装php插件包中有哪些坑
Composer安装php插件包中有哪些坑 一.总结 一句话总结:不要盲从扩展官方的composer安装命令,有时候也会出错 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 ...
- C# WPF DataGrid 隔行变色及内容居中对齐
C# WPF DataGrid 隔行变色及内容居中对齐. dqzww NET学习0 先看效果: 前台XAML代码: <!--引入样式文件--> <Window.Resourc ...
- php开发工程师面必问题
随着培训机构的增加,越来越多的php从业者流入市场,从而影响了php就业环境.公司对人才的要求越来越高,而技术者本身也要技术过硬,学习越来越多的东西,因为只有这样,你才能跑在别人前面,才不被市场抛弃, ...
- 倒置字符串函数reverse
倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置, 如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321, 程序如下: #include<st ...
- hdu 2490 队列优化dp
http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) Memo ...