今天来说一下阿里巴巴推出的Json处理工具:fastjson
由于使用独特的算法,fastjson对Json的解析是最快的,超过其他任何Json Parser,包括JackJson,除了解析速度快之外,还有很多优点,总结如下:
1.支持各种基本类型,JavaBean,集合,Map,枚举Enum,泛型,甚至是日期
2.可以直接跑在JDK上(JDK1.5版本以上)
3.开源(还有比开源分享更值得令人尊敬的吗)
接下来尝试一下fastjson如何解析Json
首先是和实体类之间的转换,创建一个实体类对象,并为三个字段设值,然后解析为Json对象
student=new StudentInfo();
student.setAddress("苏州");
student.setAge(15);
student.setName("zhansan");
json=(JSONObject) JSON.toJSON(student);
System.out.println(json);
输出结果为:
{"name":"zhansan","address":"苏州","age":15}
此时可在json对象中插入一条新数据,这条数据的键key在实体对象中存在对应字段,然后再讲json对象解析为实体类
json.put("ingore", "something");
StudentInfo student1=JSONObject.toJavaObject(json, StudentInfo.class);
System.out.println(student1.getIngore());
测试一下字段ingore,结果可正常输出:something
接着来遍历json
for (Entry entry : json.entrySet()) {
System.out.println("键时:"+entry.getKey()+" 值是:"+entry.getValue());
}
输出结果:
键时:name 值是:zhansan
键时:birth 值是:null
键时:address 值是:苏州
键时:ingore 值是:something
键时:age 值是:15.0
键时:likes 值是:null
然后是集合list和Json的转换,在遍历json时,将每个entry对象都存在list中,再将list解析为JSONArray对象
for (Entry entry : json.entrySet()) {
System.out.println("键时:"+entry.getKey()+" 值是:"+entry.getValue());
list.add(entry);
}
//json和集合之间的转化(可以是各种集合,比如map,list,set)
jsonArray=(JSONArray) JSONArray.toJSON(list);
System.out.println(jsonArray);
输出结果:
[{"value":"zhansan","key":"name"},{"key":"birth"},{"value":"苏州","key":"address"},{"value":"something","key":"ingore"},{"value":15,"key":"age"},{"key":"likes"}]
看起来不太方便,使用谷歌插件JSON-handle处理一下:
[
{
"value": "zhansan",
"key": "name"
},
{
"key": "birth"
},
{
"value": "苏州",
"key": "address"
},
{
"value": "something",
"key": "ingore"
},
{
"value": 15,
"key": "age"
},
{
"key": "likes"
}
]
最后看一下日期的解析
Object date=new Date();
String dateStr=JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss");
System.out.println(dateStr);
输出:
"2018-09-04 22:22:08"
事实上json的解析方法远不止这些(看下面),大家可以根据场景需求选取合适的方法
在这些方法中,有些方法很尤为重要,在这里说一种经常使用的方法,可以将字符串解析为任意一种形式(前提是可以转换)比如,转换为列表list
String string="['name','lisi','address','suzhou']";
list=JSON.parseObject(string, new TypeReference>(){});
System.out.println(list);
输出结果为:
[name, lisi, address, suzhou]
new TypeReference>(){}可以自定义解析成为什么类型,但是前提是字符串是可以解析为定义的类型,比如这个字符串"['name','lisi','address','suzhou']"无法解析为map,因为map是键值对类型,当前字符串无键值对应关系,自然会报错