JAVA中的四种JSON解析方式详解

转自https://www.cnblogs.com/wenqiangit/p/11575508.html

我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式。

1、JSON官方 脱离框架使用

2、GSON

3、FastJSON 有问题

4、jackson 常用

JSON操作涉及到的类:

public classStudent{

    private int id;

    private String name;

    private int age;

    publicintgetId(){

        return id;

    }

    publicvoidsetId(intid){

        this.id = id;

    }

    publicStringgetName(){

        return name;

    }

    publicvoidsetName(String name){

        this.name = name;

    }

    publicintgetAge(){

        return age;

    }

    publicvoidsetAge(intage){

        this.age = age;

    }

    publicStudent(intid, String name,intage){

        super();

        this.id = id;

        this.name = name;

        this.age = age;

    }

    publicStudent(){

        super();

    }

    @Override    publicStringtoString(){

        return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";

    }

}


public classGrade{

    private int id;

    private String name;

    private ArrayList<Student> stus;

    publicGrade(intid, String name, ArrayList stus){

        super();

        this.id = id;

        this.name = name;

        this.stus = stus;

    }

    publicGrade(){

        super();

    }

    @Override    publicStringtoString(){

        return "Grade [id=" + id + ", name=" + name + ", stus=" + stus + "]";

    }

    publicintgetId(){

        return id;

    }

    publicvoidsetId(intid){

        this.id = id;

    }

    publicStringgetName(){

        return name;

    }

    publicvoidsetName(String name){

        this.name = name;

    }

    publicArrayListgetStus(){

        return stus;

    }

    publicvoidsetStus(ArrayList<Student> stus){

        this.stus = stus;

    }

}


JSON官方的解析最具有通用性,但是有点小麻烦。

package cn.itcast.test;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import org.junit.Test;import java.util.ArrayList;public classJsonTest{

    @Test    publicvoidtest1(){

        String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘一','age':16},{'id':102,'name':'刘二','age':23}]}";

        //数组        String json2 = "['北京','天津','杭州']";//        JSONObject jObject = new JSONObject(json1);        JSONObject jsonObject = JSONObject.fromObject(json1);//        System.out.println(jsonObject);//        Map<String,Object> map = jsonObject;//        for (Map.Entry<String, Object> entry : map.entrySet()) {//            System.out.println(entry.getKey());//            System.out.println(entry.getValue());//            System.out.println("=========");//        }        Grade grade = new Grade();

        grade.setId(jsonObject.getInt("id"));

        grade.setName(jsonObject.getString("name"));

        ArrayList<Student> students = new ArrayList<>();

        grade.setStus(students);

        JSONArray stus = jsonObject.getJSONArray("stus");

        for (Object o : stus) {//            System.out.println(o);            JSONObject jsonObject1 = JSONObject.fromObject(o);

            Student student = new Student(jsonObject1.getInt("id"), jsonObject1.getString("name"), jsonObject1.getInt("age"));

            grade.getStus().add(student);

        }

        System.out.println(grade);

    }

    @Test    publicvoidtest2(){

        JSONObject jsonObject = new JSONObject();

        jsonObject.put("id", 100);

        jsonObject.put("name", "二弟");

        jsonObject.put("age", 30);

        JSONObject jsonObject1 = new JSONObject();

        jsonObject1.put("id", 102);

        jsonObject1.put("name", "狗蛋");

        jsonObject1.put("age", 10);

        JSONArray jsonArray = new JSONArray();

        jsonArray.add(jsonObject);

        jsonArray.add(jsonObject1);

        System.out.println(jsonArray);

    }

}


GSON解析是谷歌的,也比较好用

public classGSONTest{

    //解析    @Test    publicvoidtest1(){

        // 对象嵌套数组嵌套对象        String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘一','age':16}]}";

        // 数组        String json2 = "['北京','天津','杭州']";

        Gson gson=new Gson();

        //1、        //解析对象:第一个参数:待解析的字符串 第二个参数结果数据类型的Class对象        Grade grade=gson.fromJson(json1, Grade.class);

        System.out.println(grade);

        //2、        //解析数组要求使用Type        ArrayList<String> list=gson.fromJson(json2,

                new TypeToken<ArrayList<String>>(){}.getType());

        System.out.println(list);

    }

    //生成    @Test    publicvoidtest2(){

        ArrayList<Student> list=new ArrayList<>();

        for(int i=1;i<3;i++){

            list.add(new Student(101+i, "码子", 20+i));

        }

        Grade grade=new Grade(100001,"张三", list);

        Gson gson=new Gson();

        //将对象转换为诶JSON格式字符串        String json=gson.toJson(grade);

        System.out.println(json);

    }

}


FastJSON是阿里巴巴的产品,效率最高

public classFASTJson{

    //解析    @Test    publicvoidtest1(){

        // 对象嵌套数组嵌套对象        String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘铭','age':16}]}";

        // 数组        String json2 = "['北京','天津','杭州']";

        //1、        //静态方法        Grade grade=JSON.parseObject(json1, Grade.class);

        System.out.println(grade);

        //2、        List<String> list=JSON.parseArray(json2, String.class);

        System.out.println(list);

    }

    //生成    @Test    publicvoidtest2(){

        ArrayList<Student> list=new ArrayList<>();

        for(int i=1;i<3;i++){

            list.add(new Student(101+i, "码子", 20+i));

        }

        Grade grade=new Grade(100001,"张三", list);

        String json=JSON.toJSONString(grade);

        System.out.println(json);

    }

}

jackSon解析JSON,SpringMVC内置的解析器就是这个


package cn.itcast.test;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.ObjectMapper;import org.junit.Test;import java.io.IOException;import java.util.ArrayList;import java.util.List;public classjackSonTest{

    @Test    publicvoidtest1()throwsIOException{

        // 对象嵌套数组嵌套对象        String json1 = "{\"id\":1,\"name\":\"JAVAEE-1703\",\"stus\":[{\"id\":101,\"name\":\"刘一\",\"age\":16}]}";

        // 数组        String json2 = "[\"北京\",\"天津\",\"杭州\"]";

        ObjectMapper mapper = new ObjectMapper();

        Grade grade = mapper.readValue(json1, Grade.class);

        System.out.println(grade);

        List<String> list = mapper.readValue(json2, new TypeReference<List<String>>() {

        });

        System.out.println(list);

    }

    @Test    publicvoidtest2()throwsJsonProcessingException{

        ArrayList<Student> students = new ArrayList<>();

        for (int i = 0; i < 3; i++) {

            students.add(new Student(100 + i, "二稿" + i, 1000 + i));

        }

        Grade grade = new Grade(22, "语文", students);//        System.out.println(grade);        ObjectMapper objectMapper = new ObjectMapper();

        String s = objectMapper.writeValueAsString(grade);

        System.out.println(s);

    }

}

除了JSON官方的对类没有要求,剩下的都要求是标准的类,否则无法解析,因为都用到了反射。

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

推荐阅读更多精彩内容