代码无真相,为了最简单的说明,我直接上代码。

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>类的对象。因此要想获得泛型的集合类型需要通过其它办法:

/**  
* 获取泛型的Collection Type  
* @param jsonStr json字符串  
* @param collectionClass 泛型的Collection  
* @param elementClasses 元素类型  
*/
public static <T> T readJson(String jsonStr, Class<?> collectionClass, Class<?>... elementClasses) throws Exception {

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对象转换 之一的更多相关文章

  1. jackson 进行json与java对象转换 之三

    2.测试类,没用Junit,用Main()方法输出. package test; import java.io.IOException; import java.util.ArrayList; imp ...

  2. jackson 进行json与java对象转换 之二

    主要用于测试学习用jackson包实现json.对象.Map之间的转换. 1.准备测试用的Java类 (1)Link类 package test; /** * Description: 联系方式,被u ...

  3. jackson 进行json与java对象转换 之四

    jackson简单使用,对象转json,json转对象,json转list   POJO序列化为json字符串: 准备一个POJO: @JsonIgnoreProperties(ignoreUnkno ...

  4. FastJson、Jackson、Gson进行Java对象转换Json细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  5. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  6. JSON 与JAVA对象之间的转换(转)

    JSON与XML两者目前在数据交互方面都有很高的使用率,随着现在SOA的兴起,异构系统的整合地位相应提高,本篇文章主要介绍JSON与JAVA对象之间的相互转换. 一.对普通类型的JSON模式的转换 一 ...

  7. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  8. JAVA对象转换JSON

    1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist); String ...

  9. JSON与Java对象的互相转换

    JSON与Java对象的互相转换 例一(单个对象进行赋值): @RequestMapping("test1.do") @ResponseBody public JSONObject ...

随机推荐

  1. 最全面的linux信号量解析

    信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程) 所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用, ...

  2. (python)循环中动态产生变量

    >>> for i in xrange(5): exec 'a'+str(i)+' = '+str(i)+'' >>> a0 0 >>> a1 1 ...

  3. OpenStack企业私有云新需求(1):Nova 虚机支持 GPU

    作者:Sammy Liu 刘世民 本系列会介绍OpenStack 企业私有云的几个需求: GPU 支持 自动扩展(Auto-scaling)支持 混合云(Hybrid cloud)支持 物理机(Bar ...

  4. jquery 之 Deferred 使用

    Deferred是jquery的promise接口的实现.他是非同步操作的通用接口,可以看作是完成一个任务之后再执行另外一个任务. 观察者模式是开发中经常使用的模式,这个模式由两个主要部分组成:主题和 ...

  5. PyCharm 的初始设置1

    PyCharm 的初始设置 PyCharm 的官方网站地址是:https://www.jetbrains.com/pycharm/ 01. 恢复 PyCharm 的初始设置 PyCharm 的 配置信 ...

  6. Composer安装php插件包中有哪些坑

    Composer安装php插件包中有哪些坑 一.总结 一句话总结:不要盲从扩展官方的composer安装命令,有时候也会出错 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 ...

  7. C# WPF DataGrid 隔行变色及内容居中对齐

    C# WPF DataGrid 隔行变色及内容居中对齐. dqzww NET学习0     先看效果: 前台XAML代码: <!--引入样式文件--> <Window.Resourc ...

  8. php开发工程师面必问题

    随着培训机构的增加,越来越多的php从业者流入市场,从而影响了php就业环境.公司对人才的要求越来越高,而技术者本身也要技术过硬,学习越来越多的东西,因为只有这样,你才能跑在别人前面,才不被市场抛弃, ...

  9. 倒置字符串函数reverse

    倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置, 如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321, 程序如下: #include<st ...

  10. hdu 2490 队列优化dp

    http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    Memo ...