FastJSON 简介及其Map/JSON/String 互转

来源:互联网 发布:2月份的淘宝是旺季吗 编辑:程序博客网 时间:2024/06/08 14:07

在日志解析,前后端数据传输交互中,经常会遇到 String 与 map、json、xml 等格式相互转换与解析的场景,其中 json 基本成为了跨语言、跨前后端的事实上的标准数据交互格式。应该来说各个语言中 解析 json 的库都一大片(具体 json 格式与三方库的介绍请见: http://www.json.org/json-zh.html ),比如 python 都集成在了内置库中,成为标准 API,今天我们要聊的是 java 中如何方便的使用 json 格式。

从上面的链接介绍中我们可以看到,java 的三方 json 库是最多的,可谓百花齐放百家争鸣的节奏。。。但是,某些库存在链式依赖的问题,使用的时候要注意,如果你没用 maven 管你你的依赖,用起来会很痛苦,比如 json-lib、smart-json 等。下面我要推荐的是阿里巴巴工程师开源的一个 json 库:FastJSON,这个库在解析速度和易用性上来说都很不错。  

1、了解fastjson

1.1 Fastjson介绍

Fastjson是一个Java语言编写的JSON处理器。 
1、遵循 http://json.org 标准,为其官方网站收录的参考实现之一。 
2、功能qiang打,支持JDK的各种类型,包括基本的JavaBean、Collection、Map、Date、Enum、泛型。 
3、无依赖,不需要例外额外的jar,能够直接跑在JDK上。 
4、开源,使用Apache License 2.0协议开源。

1.2 如果获得Fastjson? 
https://github.com/alibaba/fastjson

2、主要的使 用入口

Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject    public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。

3、有关类库的一些说明

SerializeWriter:相当于StringBuffer

JSONArray:相当于List<Object>

JSONObject:相当于Map<String, Object>

JSON反序列化没有真正数组,本质类型都是List<Object>

4、fastjson还有很多很高级的特性

比如支持注解、支持全类型序列化,这些都是很好的特性,功能强大,不在本次测试范围。

5、测试代码

package lavasoft.stu.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; import java.util.*; /** * Created by IntelliJ IDEA. * * @author leizhimin 11-11-22 上午9:15 */ public class Foo {   private String vString = "vStringhehhehe";   private char vchar = 'x';   private byte vbyte = 64;   private short vshort = 128;   private int vint = 65535;   private long vlong = 9999999L;   private float vfloat = 12.1f;   private double vdouble = 22.203d;   private boolean vboolean = false; //private Date vdate = new Date();   private Date dddd = new Date();   private Date vDate = new Date();   private Date v_Date = new Date();   private Object vnull = null;   private String[] avString = {"aaa", "bbb", "ccc"};   private int[] avint = {1, 2, 3, 4};   private boolean[] avboolean = {true, false, true, true};   private List<String> listString = new ArrayList<String>();   private Map<String, String> map = new HashMap<String, String>();   private Bar bar = new Bar();   private Bar[] avBar = {new Bar(), new Bar()};   private List<Bar> listBar = new ArrayList<Bar>();   {     listString.add("listString1");     listString.add("listString2");     listString.add("listString3");     map.put("x", "s11111x");     map.put("y", "s22222y");     map.put("z", "s33333z");     listBar.add(new Bar());     listBar.add(new Bar());     listBar.add(new Bar());   }   public String getvString() {     return vString;   }   public void setvString(String vString) {     this.vString = vString;   }   public char getVchar() {     return vchar;   }   public void setVchar(char vchar) {     this.vchar = vchar;   }   public byte getVbyte() {     return vbyte;   }   public void setVbyte(byte vbyte) {     this.vbyte = vbyte;   }   public short getVshort() {     return vshort;   }   public void setVshort(short vshort) {     this.vshort = vshort;   }   public int getVint() {     return vint;   }   public void setVint(int vint) {     this.vint = vint;   }   public long getVlong() {     return vlong;   }   public void setVlong(long vlong) {     this.vlong = vlong;   }   public float getVfloat() {     return vfloat;   }   public void setVfloat(float vfloat) {     this.vfloat = vfloat;   }   public double getVdouble() {     return vdouble;   }   public void setVdouble(double vdouble) {     this.vdouble = vdouble;   }   public boolean isVboolean() {     return vboolean;   }   public void setVboolean(boolean vboolean) {     this.vboolean = vboolean;   }   public Date getDddd() {     return dddd;   }   public void setDddd(Date dddd) {     this.dddd = dddd;   }   public Date getV_Date() {     return v_Date;   }   public void setV_Date(Date v_Date) {     this.v_Date = v_Date;   }   public Date getvDate() {     return vDate;   }   public void setvDate(Date vDate) {     this.vDate = vDate;   }   public Object getVnull() {     return vnull;   }   public void setVnull(Object vnull) {     this.vnull = vnull;   }   public String[] getAvString() {     return avString;   }   public void setAvString(String[] avString) {     this.avString = avString;   }   public int[] getAvint() {     return avint;   }   public void setAvint(int[] avint) {     this.avint = avint;   }   public boolean[] getAvboolean() {     return avboolean;   }   public void setAvboolean(boolean[] avboolean) {     this.avboolean = avboolean;   }   public List<String> getListString() {     return listString;   }   public void setListString(List<String> listString) {     this.listString = listString;   }   public Map<String, String> getMap() {     return map;   }   public void setMap(Map<String, String> map) {     this.map = map;   }   public Bar getBar() {     return bar;   }   public void setBar(Bar bar) {     this.bar = bar;   }   public Bar[] getAvBar() {     return avBar;   }   public void setAvBar(Bar[] avBar) {     this.avBar = avBar;   }   public List<Bar> getListBar() {     return listBar;   }   public void setListBar(List<Bar> listBar) {     this.listBar = listBar;   } }

package lavasoft.stu.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; import java.util.Date; import java.util.Random; /** * Created by IntelliJ IDEA. * * @author leizhimin 11-11-22 上午9:15 */ public class Bar {   public static SerializeConfig mapping = new SerializeConfig();   private String barName;   private int barAge;   private Date barDate = new Date();   static {     mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd"));   }   {     Random r = new Random();     barName = "sss_"+String.valueOf(r.nextFloat());     barAge = r.nextInt();   }   public static void main(String[] args) {     Object obj = JSON.toJSON(new Bar());     String x1 = JSON.toJSONString(new Bar(), true);     System.out.println(x1);     String x2 = JSON.toJSONString(new Bar(), mapping);     System.out.println(x2);   }   public String getBarName() {     return barName;   }   public void setBarName(String barName) {     this.barName = barName;   }   public int getBarAge() {     return barAge;   }   public void setBarAge(int barAge) {     this.barAge = barAge;   }   public Date getBarDate() {     return barDate;   }   public void setBarDate(Date barDate) {     this.barDate = barDate;   }   @Override   public String toString() {     return "Bar{" +         "barName='" + barName + '\'' +         ", barAge=" + barAge +         ", barDate=" + barDate +         '}';   } }

package lavasoft.stu.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; import java.util.*; /** * Created by 2IntelliJ IDEA. * * @author leizhimin 11-11-22 上午9:45 */ public class Test {   private static SerializeConfig mapping = new SerializeConfig(); static {     mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));   }   public static void main(String[] args) {     Foo f1 = new Foo();     Date date = new Date();     String text = JSON.toJSONString(date, mapping);     System.out.println(text);     System.out.println(JSON.toJSONString(f1, true));     String x2 =JSON.toJSONString(f1, mapping);     System.out.println(x2);   }   public static void json2List(){     //List -> JSON array     List<Bar> barList = new ArrayList<Bar>();     barList.add(new Bar());     barList.add(new Bar());     barList.add(new Bar());     String json= JSON.toJSONString(barList, true);     System.out.println(json);     //JSON array -> List     List<Bar> barList1 = JSON.parseArray(json,Bar.class);     for (Bar bar : barList1) {       System.out.println(bar.toString());     }   }   public static void json2Map(){     //Map -> JSON     Map<String,Bar> map = new HashMap<String, Bar>();     map.put("a",new Bar());     map.put("b",new Bar());     map.put("c",new Bar());     String json = JSON.toJSONString(map,true);     System.out.println(json);     //JSON -> Map     Map<String,Bar> map1 = (Map<String,Bar>)JSON.parse(json);     for (String key : map1.keySet()) {       System.out.println(key+":"+map1.get(key));     }   }   public static void array2JSON(){     String[] arr_String    = {"a","b","c"};     String json_arr_String = JSON.toJSONString(arr_String,true);     System.out.println(json_arr_String);     JSONArray jsonArray = JSON.parseArray(json_arr_String);     for (Object o : jsonArray) {       System.out.println(o);     }     System.out.println(jsonArray);   }   public static void array2JSON2(){     Bar[] arr_Bar    = {new Bar(),new Bar(),new Bar()};     String json_arr_Bar = JSON.toJSONString(arr_Bar,true);     System.out.println(json_arr_Bar);     JSONArray jsonArray = JSON.parseArray(json_arr_Bar);     for (Object o : jsonArray) {       System.out.println(o);     }     System.out.println(jsonArray);   }   public static void map2JSON(){     Map map = new HashMap();     map.put("a","aaa");     map.put("b","bbb");     map.put("c","ccc");     String json=JSON.toJSONString(map);     System.out.println(json);     Map map1 = JSON.parseObject(json);     for (Object o : map.entrySet()) {       Map.Entry<String,String> entry = (Map.Entry<String,String>)o;       System.out.println(entry.getKey()+"--->"+entry.getValue());     }   } }

说明:

SerializeConfig:是对序列化过程中一些序列化过程的特殊配置,这里用作日期格式的定义。

有关需要带类型的全类型序列化过程,需要调用JSON.toJSONStringZ()方法。

需要美化输出时候,需要打开序列化美化开关,在方法中true那个参数。

输出结果:
"2011-11-23 23:30:33" {   "avBar":[{     "barAge":174398800,     "barDate":1322062233062,     "barName":"sss_0.62378174"   },{     "barAge":38938962,     "barDate":1322062233062,     "barName":"sss_0.36014742"   }],   "avString":["aaa","bbb","ccc"],   "avboolean":[true,false,true,true],   "avint":[1,2,3,4],   "bar":{     "barAge":1601495948,     "barDate":1322062233062,     "barName":"sss_0.46644872"   },   "dddd":1322062233046,   "listBar":[     {       "barAge":-1090113522,       "barDate":1322062233062,       "barName":"sss_0.83562374"     },     {       "barAge":478603194,       "barDate":1322062233062,       "barName":"sss_0.59483266"     },     {       "barAge":1118357669,       "barDate":1322062233062,       "barName":"sss_0.9961642"     }   ],   "listString":[     "listString1",     "listString2",     "listString3"   ],   "map":{"x":"s11111x","y":"s22222y","z":"s33333z"},   "v_Date":1322062233046,   "vboolean":false,   "vbyte":64,   "vchar":"x",   "vdouble":22.203,   "vfloat":12.1,   "vint":65535,   "vlong":9999999,   "vshort":128 } {"avBar":[{"barAge":174398800,"barDate":"2011-11-23 23:30:33","barName":"sss_0.62378174"},{"barAge":38938962,"barDate":"2011-11-23 23:30:33","barName":"sss_0.36014742"}],"avString":["aaa","bbb","ccc"],"avboolean":[true,false,true,true],"avint":[1,2,3,4],"bar":{"barAge":1601495948,"barDate":"2011-11-23 23:30:33","barName":"sss_0.46644872"},"dddd":"2011-11-23 23:30:33","listBar":[{"barAge":-1090113522,"barDate":"2011-11-23 23:30:33","barName":"sss_0.83562374"},{"barAge":478603194,"barDate":"2011-11-23 23:30:33","barName":"sss_0.59483266"},{"barAge":1118357669,"barDate":"2011-11-23 23:30:33","barName":"sss_0.9961642"}],"listString":["listString1","listString2","listString3"],"map":{"x":"s11111x","y":"s22222y","z":"s33333z"},"v_Date":"2011-11-23 23:30:33","vboolean":false,"vbyte":64,"vchar":"x","vdouble":22.203,"vfloat":12.1,"vint":65535,"vlong":9999999,"vshort":128} Process finished with exit code 0

测试小例子:

JSONObject json = new JSONObject();json.put("aa", "11");json.put("bb", "22");json.put("cc", "33");String jsonStr = json.toString();System.out.println(jsonStr);// {"aa":"11","bb":"22","cc":"33"}  System.out.println(JSONObject.parseObject(jsonStr).get("aa"));// 11String o = "{'area':{'area':'1','pagetype':'home'},'pagetype':'home'}";System.out.println(((Map) JSONObject.parseObject(o).get("area")).get("area"));// 1String text = JSON.toJSONString(o);Map<String, Object> userMap =     JSON.parseObject(o, new TypeReference<Map<String, Object>>() {});System.out.println(((Map) userMap.get("area")).get("NotExsit"));// nullSystem.out.println(JSON.toJSONString((Map) userMap.get("area")));// {"area":"1","pagetype":"home"}

fastjson通过各方面测试都很好,功能性能都是No.1,喜欢,它的源代码质量很高,作者也煞费苦心,将性能做到了最好,全免超越其他的json类库。

从其中的源代码中,可以学到很多东西,在阅读源码后,不得不佩服作者高超的程序设计水平,和高质量的编码。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 内衣肩带不带调整的怎么办 不正确佩戴胸罩导致下垂怎么办 增肌时期晚上饿怎么办 啤酒和可乐喝了怎么办 脸部毛孔堵塞不出汗怎么办 减肥运动完饿了怎么办 想减肥晚上饿了怎么办 孕妇喝不进去水怎么办 跑步喝多了水怎么办 衣柜门轮子坏了怎么办 穿瑜伽裤下边有缝怎么办 3岁宝宝比较内向怎么办 我想和我同学搞基怎么办 自己做的葡萄酒太甜怎么办 吉米学校想退款怎么办 汽车租赁公司不退押金怎么办 身材不好怎么办健身教练形象照 反祈祷式做不到怎么办 窦性心跳过缓怎么办 四维彩超查出胎儿心脏有问题怎么办 减脂肚子饿了怎么办 做瑜伽腰扭到了怎么办 出了汗怎么办活动反思 农村都是老人和孩子怎么办 瑜伽垫容易出现痕迹怎么办 37岁失业了该怎么办 45岁找什么工作怎么办 华为手机4g网速慢怎么办 解析软件包时出现问题怎么办 一字马不能下去髋摆不正怎么办 练轮瑜伽骆驼式腰疼怎么办 感昌咳嗽老不好怎么办 我感昌一直不好怎么办 腰间盘突出晚上睡觉痛怎么办 天天吃撑了怎么办啊 一吸气就想咳嗽怎么办 鼻子堵住了怎么办没法吸气时 一只鼻子不通气怎么办 练瑜伽后特别饿怎么办 站一天小腿肿了怎么办 练腹肌腰粗了怎么办