FastJson:fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,本篇章只讲述Json与对象之间的转换。至于fastJson在Spring或者jarx等框架中的使用本篇不作讲述。在使用Fast-Josn时,我们只需要引入阿里的fast-json库即可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
Fastjson主要的API是 com.alibaba.fastjson.JSON,com.alibaba.fastjson.JSONObject和com.alibaba.fastjson.JSONArray。JSONObject表示JSON对象,JSONArray表示JSON数组,下面一个入门案例展示如何创建JSON对象和JSON数组。
//创建JSON对象
JSONObject jsonObject = new JSONObject();
//put方法往json存储字段,key为String,Value为Object
jsonObject.put("id", 1);
jsonObject.put("name", "pharos");
Map<String,Object> hashMap = new HashMap<String,Object>();
hashMap.put("age", 25);
hashMap.put("isWorker", true);
//存储hashMap,其实将Map转换为JSON格式。
jsonObject.putAll(hashMap);
//fluentPut流式编程fluentPutAll也是如此,不再示例
jsonObject.fluentPut("email", "pharosw@126.com").put("qq", "813844896");
//创建JSONArray对象
JSONArray jsonArray = new JSONArray();
//JSONArray中有add方法,往json数组中添加一个元素,
//与add方法类似,还有fluentAdd方法,流式编程
jsonArray.add("music");
jsonArray.add(1,"running");
//直接添加集合,添加多个元素
//与add方法类似,还有fluentAddAll方法,流式编程
jsonArray.addAll(new ArrayList<Object>());
jsonArray.addAll(4, new ArrayList<Object>());
jsonObject.put("hobby", jsonArray);
从上面的例子已经API可以看到JSONObject和JSONArray存储的数组均为Object,再从其取数据时,他们提供了get方法返回Object类型,如果知道存储的是具体的类型,还可以通过getXxx获取具体类型的数据。如下为其部分API的使用:
//获取布尔型
Boolean isWorker = jsonObject.getBoolean("isWorker");
boolean isWorkerValue = jsonObject.getBooleanValue("isWorker");
//获取整型
Integer id = jsonObject.getInteger("id");
int idValue = jsonObject.getIntValue("id");
//获取字符串类型
String name = jsonObject.getString("name");
//获取Object类型
Object qq = jsonObject.get("qq");
//JSONArray是根据索引获取不同类型的数据
jsonArray.get(0);
jsonArray.getInteger(1);
jsonArray.getBooleanValue(2);
上面的案例是JSONObject获取整型、字符串、布尔型的数值,JSONArray也有如此类似方法,不再举例子,除此之外,还有getBigDecimal,getBigInteger,getByte,getDouble,getJSONArray和getObject等方法,getObject方法可以将JSON转换为对应的实体类。JSONObject,JSONArray有如此多的get方法,我们就需要关注如果JSONuObject的key不存在或者JSONArray的索引不存在时是怎么处理的,默认值是多少。如下列表为key不存在时的默认值。
method | value |
get(Object key) | null |
getBooleanValue(String key) | false |
getBoolean(String key) | null |
getIntValue(String key) | 0 |
getByteValue(String key) | 0 |
getShortValue(String key) | 0 |
getByte(String key) | null |
getBigInteger(String key) | null |
getInteger(String key) | null |
getDoubleValue(String key) | 0.0 |
getFloatValue(String key) | 0.0 |
上面列举了一部分JSONObject的默认值,总结起来就是非基本类型的数据(包括包装类)默认值为null,基本类型的数据布尔型默认为false,整型默认为0,浮点型默认为0.0。如果获取时,类型转换失败,则抛出异常。比如:
Exception in thread "main" java.lang.NumberFormatException: For input string: "pharos"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at com.alibaba.fastjson.util.TypeUtils.castToInt(TypeUtils.java:817)
at com.alibaba.fastjson.JSONObject.getIntValue(JSONObject.java:243)
at cn.org.microservice.fastjson.starter.FastJsonStarter.main(FastJsonStarter.java:59)