JSON

各个JSON技术的比较

  1. json-lib
    最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,
    包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,
    对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。
    json-lib在功能和性能上面都不能满足现在互联网化的需求。
//创建一个javabean
public class Item {
    private String name;
    private int size;
    private String type;
    //getter and setter

    public Item(){}

    public Item(String name, int size, String type) {
        this.name = name;
        this.size = size;
        this.type = type;
    }

    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", size=" + size +
                ", type='" + type + '\'' +
                '}';
    }
}
//核心代码
public static void main(String[] args) {

        Item item1 = new Item("itemName1",21,"String");
        Item item2 = new Item("itemName2",22,"Boolean");
        Item item3 = new Item("itemName3",23,"Integer");

        List<Item> list = new ArrayList<Item>();//构造一个List集合
        list.add(item1);
        list.add(item2);
        list.add(item3);


        Item[] items = {item1,item2,item3};//构造一个数组

        Map<String,Item> map = new HashMap<String,Item>();//构造一个map集合
        map.put(item1.getName(),item1);
        map.put(item2.getName(),item2);
        map.put(item3.getName(),item3);


        //将Java数组转换成JSONArray
        JSONArray jsonArray = JSONArray.fromObject(items);
        System.out.println(jsonArray);

        //将Java的List集合转换成JSONArray
        jsonArray = JSONArray.fromObject(list);
        System.out.println(jsonArray);

        //将Java的Map集合转换成JSONObject
        JSONObject jsonObject = JSONObject.fromMap(map);//(1)
        System.out.println(jsonObject);
        jsonObject = JSONObject.fromObject(map);//(2)
        System.out.println(jsonObject);
        //(1)(2)都可以

        //将普通的JavaBean转换成JSONObject
        jsonObject = JSONObject.fromObject(item1);
        System.out.println(jsonObject);

        //将JSONObject转换成JavaBean对象
        Item item = (Item) JSONObject.toBean(jsonObject, Item.class);
        System.out.println(item.toString());

        //JSONObject的方法
        String name = (String) jsonObject.get("name");//取得JavaBean的属性值
        System.out.println(name);
        //向json对象中添加JavaBean对象或者任意类型数据
        JSONObject testObj1 = jsonObject.accumulate("test1", item1);
        System.out.println(testObj1);
        //向json对象中添加JavaBean对象或者任意类型数据
        JSONObject testObj2 = jsonObject.put("test", item2);
        System.out.println(testObj2);
    }
//从Java对象(包括集合对象)到json对象均可使用fromObject()方法,唯一不同的是调用方法的对象不一致(map集合以外常用的集合使用JSONArray,map集合及简单JavaBea使用JSONObject)。
  1. 开源的Jackson
    相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
    而且Jackson社区相对比较活跃,更新速度也比较快。
    Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
    Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
  2. Google的Gson
    Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
    但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
    Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
    而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
    类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
    Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
  3. 阿里巴巴的FastJson
    Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
    无依赖,不需要例外额外的jar,能够直接跑在JDK上。
    FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
    FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
//Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

public static final Object parse(Stringtext); // 把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。
//SerializeWriter:相当于StringBuffer
//JSONArray:相当于List<Object>
//JSONObject:相当于Map<String, Object>
//JSON反序列化没有真正数组,本质类型都是List<Object>

一、json字符串的数据解析
1.json字符串 ---> JSONObject或者JSONArray【好处就是当你没有bean的model类时,可以直接获取相关数据】
          Object parse(String text)【这是下面2个方法的合集,是大招!】
          JSONObject parseObject(String text)
          JSONArray parseArray(String text)

2.json字符串 ---> bean对象【好处是如果你有model,你可以解析为java对象然后继续操作】
          T parseObject(String text, Class clazz)          //一个bean对象的解析生成
          List parseArray(String text, Class clazz)          //多个bean对象的解析生成

二、java对象的json格式化

1.bean对象转json字符串
          String toJSONString(Object object)
          String toJSONString(Object object, boolean prettyFormat)
2.java对象转换为JSONObject或者JSONArray【是大招,单个bean对象能转,list集合也能转】,有了这一步,再来个toString就ok了。
     Object toJSON(Object javaObject);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容