Json解析方法大全

JSON是一种轻量级的数据交换格式,和XML一样广泛应用于前端和后台的交互。如何高效和安全的解析JSON是摆在广大程序员面前的难题,如果有工具包能帮我们做这些事情就好了,目前有Google公司的Gson,阿里巴巴公司的fastJson,以及Jackson,今天我就讲解下如何通过这3个工具去解析JSON字符串,以及如何将Java对象转换成JSON字符串。

1.Gson

首先在工程的pom文件中加入依赖

<dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.3.1</version>
      <scope>compile</scope>
</dependency>

这样工程引入了gson-2.3.1.jar

1.1 将BankDto.java对象转为json字符串

 Gson gson = new GsonBuilder().create();
        
 BankDto bankDto = new BankDto();
 bankDto.setBankId(1L);
 bankDto.setBankCode("95555");
 bankDto.setBankName("CMB");
 bankDto.setState("A");
 bankDto.setStateDate(new java.util.Date());
 System.out.println(gson.toJson(bankDto, BankDto.class));


输出的结果:

{"bankId":1,"bankName":"CMB","state":"A","stateDate":"Jun 17, 2017 9:55:17 PM","bankCode":"95555"}

1.2 将List转为json字符串

Gson gson = new GsonBuilder().create();
List<BankDto> bankList = new ArrayList<BankDto>();
BankDto bankDto = new BankDto();
bankDto.setBankId(1L);
bankDto.setBankCode("95555");
bankDto.setBankName("CMB");
bankDto.setState("A");
bankDto.setStateDate(new java.util.Date());
bankList.add(bankDto);
        
bankDto = new BankDto();
bankDto.setBankId(2L);
bankDto.setBankCode("95888");
bankDto.setBankName("ABC");
bankDto.setState("A");
bankDto.setStateDate(new java.util.Date());
bankList.add(bankDto);
System.out.println(gson.toJson(bankList));

输出结果

[{"bankId":1,"bankName":"CMB","state":"A","stateDate":"Jun 17, 2017 10:07:47 PM","bankCode":"95555"},{"bankId":2,"bankName":"ABC","state":"A","stateDate":"Jun 17, 2017 10:07:47 PM","bankCode":"95888"}]

1.3 对于嵌套的对象转为json字符串

Gson gson = new GsonBuilder().create();
List<BankDto> bankList = new ArrayList<BankDto>();
BankDto bankDto = new BankDto();
bankDto.setBankId(1L);
bankDto.setBankCode("95555");
bankDto.setBankName("CMB");
bankDto.setState("A");
bankDto.setStateDate(new java.util.Date());
bankList.add(bankDto);
        
PersonDto person = new PersonDto();
person.setId(123L);
person.setName("jack");
bankDto.setPersonDto(person);
        		
System.out.println(gson.toJson(bankList));


输出结果

[{"bankId":1,"bankName":"CMB","state":"A","stateDate":"Jun 17, 2017 10:17:23 PM","bankCode":"95555","personDto":{"id":123,"name":"jack"}}]


1.4 如果我们收到了json字符串,如何将其转为java对象呢

String json = "{\"bankId\":1,\"bankName\":\"CMB\",\"state\":\"A\",\"stateDate\":\"Jun 17, 2017 10:17:23 PM\",\"bankCode\":\"95555\",\"personDto\":{\"id\":123,\"name\":\"jack\"}}";    
Gson gson = new GsonBuilder().create();
BankDto bank = gson.fromJson(json, BankDto.class);
System.out.println(bank.toString());


将得到的对象打印出来,输出结果

bankId:1,bankCode:95555,bankName:CMB,personId:123,personName:jack


1.5 如果收到了json字符串,但又不知道转为什么java对象,可以直接解析json串

String json = "{\"bankId\":1,\"bankName\":\"CMB\",\"state\":\"A\",\"stateDate\":\"Jun 17, 2017 10:17:23 PM\",\"bankCode\":\"95555\",\"personDto\":{\"id\":123,\"name\":\"jack\"}}";    
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObject = element.getAsJsonObject();
System.out.println(jsonObject.getAsJsonPrimitive("bankName").getAsString());
System.out.println(jsonObject.getAsJsonPrimitive("bankCode").getAsLong());


输出结果:

CMB
95555


2.fastjson

首先在工程的pom文件中加入依赖

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.41</version>
      <scope>compile</scope>
</dependency>


这样工程就会引入fastjson-1.1.41.jar

2.1 将BankDto转为json字符串

List<BankDto> bankList = new ArrayList<BankDto>();
BankDto bankDto = new BankDto();
bankDto.setBankId(1L);
bankDto.setBankCode("95555");
bankDto.setBankName("CMB");
bankDto.setState("A");
bankDto.setStateDate(new Date());
PersonDto person = new PersonDto();
person.setId(123L);
person.setName("jack");
bankDto.setPersonDto(person);
bankList.add(bankDto);

System.out.println(JSON.toJSONString(bankList));


输出结果

[{"bankCode":"95555","bankId":1,"bankName":"CMB","personDto":{"id":123,"name":"jack"},"state":"A","stateDate":1497711670982}]


和 google相比 ,阿里的fastjson将时间直接转为长整型的时间。

2.2 将json字符串转为BankDto对象

需要注意的是,fastjson只能对json字符串中为长整型的时间才能解析,否则会报错

String json = "{\"bankId\":1,\"bankName\":\"CMB\",\"state\":\"A\",\"stateDate\":\"1497712390838\",\"bankCode\":\"95555\",\"personDto\":{\"id\":123,\"name\":\"jack\"}}";
BankDto bank = JSON.parseObject(json, BankDto.class);
System.out.println(bank.toString());


输出结果

bankId:1,bankCode:95555,bankName:CMB,stateDate:Sat Jun 17 23:13:10 CST 2017,personId:123,personName:jack


3. Jackson

首先在pom文件中加入下面两个依赖

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.6.2</version>
      <scope>compile</scope>
</dependency>
<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.6.2</version>
      <scope>compile</scope>
</dependency>


jackson-databind 是最主要的,其中就含有重要的对象转换的类ObjectMapper,jackson-annotations 这个是必须要的,否则项目就会报错,另外它含有一个重要的包jackson-core,这个包不需要引用,自动就会通过依赖加载。

3.1 将对象转为json字符串

ObjectMapper objectMapper = new ObjectMapper();
    	
try {
	System.out.println(objectMapper.writeValueAsString(bankList));
    } catch (JsonProcessingException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
    }


结果:

[{"bankId":1,"parentId":null,"bankName":"CMB","comments":null,"state":"A","stateDate":1497713764810,"directDebitFlag":null,"bankCode":"95555","spId":null,"personDto":{"id":123,"name":"jack"}}]

关于Jackson会将日期转为长整型,可以通过下面的方法解决,对时间格式进行格式化

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(simpleDateFormat);
但是即使格式化了,还是有问题,时间和原有的时间不一致


3.2 将字符串转为对象

ObjectMapper objectMapper = new ObjectMapper();
try {
	BankDto bank = objectMapper.readValue(json, BankDto.class);
	System.out.println(bank.toString());
     } catch (JsonParseException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
     } catch (JsonMappingException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
     } catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
     }


结果:

bankId:1,bankCode:95555,bankName:CMB,stateDate:Sat Jun 17 23:13:10 CST 2017,personId:123,personName:jack

总结:

总共讲解了三家公司的三个jar包实现对JSON字符串的解析和转化,Google公司的Gson个人认为更胜一筹,其在转化的时候对数据类型保持的比较好,fastjson和Jackson则在处理时间上会进行转换。大家如果要学习关于这些包是如何对JSON进行解析和转化的,个人建议可以通过去看Jackson的源码比较好,因为它提供的API都是很原生的,大家可以从它的方法上就可以看出,另外两个都包装得很厉害。


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值