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官方的对类没有要求,剩下的都要求是标准的类,否则无法解析,因为都用到了反射。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容