解析json常用几种方式

1.使用Google 的 gson方式解析json,园子里面对json方面的教程都非常多,很多写的都非常不错,借鉴不少,毕竟刚刚研究.

gson支持解析的类型还是比较全面的,包括JavaBean,List<JavaBean>,List<String>,Map等,使用起来也是比较方便.

首先配置环境,需要下载相应的jar包, 下面测试使用的版本是2.2.4.

官方下载地址:http://code.google.com/p/google-gson/

gson API:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html

 

测试用例(源码附件GsonJson.zip,下载地址:http://pan.baidu.com/s/1qWHNjdU):

public class MyGson {
    
    private Gson gson = new Gson(); 
    
    //java bean to json string
    @Test
    public void beanToJson(){
        Person person  = new Person();
        person.setId(1);
        person.setName("zhanglu");
        person.setAddress("湖北大悟");
        System.out.println(gson.toJson(person));
    }

    //json string to java bean
    @Test
    public void jsonTobean(){
        String json = "{‘id‘:‘1‘,‘name‘:‘zhang‘,‘address‘:‘Hubei‘}";
        Person person = gson.fromJson(json, Person.class);
        System.out.println(person);
    }
    
    //list<bean> to json
    @Test
    public void listBeanToJson(){
        Person person1 = new Person(1, "zhang", "Hubei");
        Person person2 = new Person(2,"lu","DaWu");
        List<Person> persons = new ArrayList<>();
        persons.add(person1);
        persons.add(person2);
        String json = gson.toJson(persons);
        System.out.println(json);
    }
    
    //json to list<bean>
    @Test
    public void jsonToListBean(){
        String json = "[{‘id‘:‘1‘,‘name‘:‘zhang‘,‘address‘:‘Hubei‘},{‘id‘:‘2‘,‘name‘:‘lu‘,‘address‘:‘DaWu‘}]";
        List<Person> persons = gson.fromJson(json, new TypeToken<List<Person>>(){}.getType());
        for(Person per : persons){
            System.out.println(per);
        }
    }
    
    
    //list string to string
    @Test
    public void listStringToJson(){
        List<String> list = new ArrayList<>();
        list.add("zhanglu");
        list.add("hubei");
        list.add("Dawu");
        String json = gson.toJson(list);
        System.out.println(json);
    }
    
    //json string to list<string>
    @Test
    public void jsonToListString(){
        String json = "[‘zhanglu‘,‘hubei‘,‘Dawu‘]";
        List<String> list = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());
        for(String str : list){
            System.out.println(str);
        }
    }
    
    //Map<String,object> to json
    @Test
    public void mapToJson(){
        Map<String, Person> map = new HashMap<>();
        Person person = new Person(1, "zhanglu", "湖北大悟");
        Person person2 = new Person(2, "Alone", "HuBeiDaWu");
        map.put("person", person);
        map.put("person2", person2);
        String json = gson.toJson(map);
        System.out.println(json);
    }
    
    //json to Map<Stirng,Object>
    @Test
    public void jsonToMap(){
        String json = "{‘person‘:{‘id‘:1,‘name‘:‘zhanglu‘,‘address‘:‘湖北大悟‘},‘person2‘:{‘id‘:2,‘name‘:‘Alone‘,‘address‘:‘HuBeiDaWu‘}}";
        Map<String, Person> map = gson.fromJson(json, new TypeToken<Map<String,Person>>(){}.getType());
        for(String str : map.keySet()){
            System.out.println("key:"+str);
            System.out.println((Person)map.get(str));
        }
    }
    
    //test refrences obj
    //如果双向引用, 会产生死循环,  方法1, 在需要被过滤的字段上加上修饰符transient, Cat的animail加上了
    //方法1:排除transient字段
    /*//方法2:排除Modifier为指定类型的字段Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PROTECTED) // <---.create();*/
    //方法3:使用@Expose注解,注意,没有被 @Expose 标注的字段会被排除,如下所示:
    @Test
    public void testReferences(){
        Animail animail = new Animail();
        animail.setName("Animial");
        Cat cat = new Cat();
        cat.setId(1);
        cat.setName("Cat1");
        cat.setAnimail(animail);
        Cat cat2 = new Cat();
        cat2.setId(2);
        cat2.setName("Cat2");
        cat.setAnimail(animail);
        List<Cat> cats  = new ArrayList<>();
        cats.add(cat2);
        cats.add(cat);
        animail.setCatlist(cats);
        String json = gson.toJson(animail);
        System.out.println(json);
    }
    
    //方法4:使用ExclusionStrategy定制字段排除策略,这种方式最灵活,下面的例子把所有以下划线开头的字段全部都排除掉:
    @Test
    public void ExclusionStrategy(){
        ClassInfo classInfo = new ClassInfo();
        classInfo.setClassNo("C0001");
        classInfo.setClassName("Java_1");
        StudentInfo stu1 = new StudentInfo();
        stu1.setStuId(1);
        stu1.setStuName(1);
        StudentInfo stu2 = new StudentInfo();
        stu2.setStuId(1);
        stu2.setStuName(1);
        stu1.setClassInfo(classInfo);
        stu2.setClassInfo(classInfo);
        List<StudentInfo> stulist = new ArrayList<>();
        stulist.add(stu2);
        stulist.add(stu1);
        classInfo.setStudentslist(stulist);
        ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {
              @Override
              public boolean shouldSkipField(FieldAttributes fa) {
                  return fa.getName().equals("classInfo");
              }

              @Override
              public boolean shouldSkipClass(Class<?> clazz) {
                  return false;
              }
         };
        Gson gson = new GsonBuilder().setExclusionStrategies(myExclusionStrategy).create();
        String json = gson.toJson(classInfo);
        System.out.println(json);
    }
}

 

2.使用阿里的fastJson方式解析json,阿里官方介绍说这个比gson效率更高速度更快,使用fastJson的人也非常多,至少我有些同学公司里面在使用, 不乏游戏开发在使用,也有人说有Bug,具体我也没有对两者进行比较测试.

fastJson同样支持常用的数据类型解析,还提供了大文本解析和对时间类型的解析方式,同样也有android版本jar, 但是这个不是C#的FastJson, 首字母大小写是不一样的, 也不是同一个东西, 不可混为一谈.

官网文档::https://github.com/alibaba/fastjson/wiki/常见问题

笔者测试使用的版本是1.1.41,下载地址:http://repo1.maven.org/maven2/com/alibaba/fastjson/1.1.41/

fastJson其它版本官方下载地址:http://repo1.maven.org/maven2/com/alibaba/fastjson/

maven配置:

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.1.41</version>
</dependency>

测试用例(源码附件fastJson.zip,下载地址:http://pan.baidu.com/s/1pJE1xsZ):

public class FastJsonTest {

    // Java bean to json
    @Test
    public void JavaBeanToJson() {
        Person person = new Person(1, "zhanglu", "Hubei");
        String json = JSON.toJSONString(person);
        System.out.println(json);
    }

    // Json to Javabean
    @Test
    public void JsonToJavaBean() {
        String json = "{‘address‘:‘Hubei‘,‘id‘:1,‘name‘:‘zhanglu‘}";
        Person person = JSON.parseObject(json, Person.class);
        System.out.println(person);
    }

    // List<JavaBean> to json
    @Test
    public void listJavaBeanToJson() {
        Person p1 = new Person(1, "zhanglu", "Hubei");
        Person p2 = new Person(2, "wukang", "Hubei");
        List<Person> personlist = new ArrayList<>();
        personlist.add(p1);
        personlist.add(p2);
        String json = JSON.toJSONString(personlist);
        System.out.println(json);
    }

    // Json to List<JavaBean>
    @Test
    public void JsonToListBean() {
        String json = "[{‘address‘:‘Hubei‘,‘id‘:1,‘name‘:‘zhanglu‘},{‘address‘:‘Hubei‘,‘id‘:2,‘name‘:‘wukang‘}]";
        List<Person> persons = JSON.parseArray(json, Person.class);
        for (Person person : persons) {
            System.out.println(person);
        }
    }

    // List<String> to json
    @Test
    public void listStringToJson() {
        List<String> list = new ArrayList<>();
        list.add("zhanglu");
        list.add("wukang");
        String json = JSON.toJSONString(list);
        System.out.println(json);
    }

    // json to List<String>
    @Test
    public void JsonToListString() {
        String json = "[‘zhanglu‘,‘wukang‘]";
        List<String> list = JSON.parseArray(json, String.class);
        for (String str : list) {
            System.out.println(str);
        }
    }

    // Map<String,Object> to json
    @Test
    public void MapToJson() {
        Map<String, Person> map = new HashMap<>();
        map.put("person1", new Person(1, "zhanglu", "Hubei"));
        map.put("person2", new Person(2, "wukang", "Hubei"));
        String json = JSON.toJSONString(map);
        System.out.println(json);
    }

    // Json to Map<String,JavaBean>
    @Test
    public void JsonToMap() {
        String json = "{‘person1‘:{‘address‘:‘Hubei‘,‘id‘:1,‘name‘:‘zhanglu‘},‘person2‘:{‘address‘:‘Hubei‘,‘id‘:2,‘name‘:‘wukang‘}}";
        Map<String, Person> map = JSON.parseObject(json,
                new TypeReference<Map<String, Person>>() {
                });
        for (String key : map.keySet()) {
            System.out.println("key:" + key);
            System.out.println(map.get(key));
        }
    }

    // Test references javaBean
    // Animail,Cat
    @Test
    public void TestReferences() {
        Animail animail = new Animail();
        animail.setName("animial");
        Cat cat = new Cat();
        cat.setId(1);
        cat.setName("MiMi");
        Cat cat2 = new Cat();
        cat2.setId(1);
        cat2.setName("CiCi");
        cat.setAnimail(animail);
        cat2.setAnimail(animail);
        List<Cat> catlist = new ArrayList<>();
        catlist.add(cat2);
        catlist.add(cat);
        animail.setCatlist(catlist);
        String json = JSON.toJSONString(animail);
        System.out.println(json);
    }

    // Test references javaBean
    // Animail,Cat
    @Test
    public void TestReferences2() {
        Animail animail = new Animail();
        animail.setName("animial");
        Cat cat = new Cat();
        cat.setId(1);
        cat.setName("MiMi");
        Cat cat2 = new Cat();
        cat2.setId(1);
        cat2.setName("CiCi");
        cat.setAnimail(animail);
        cat2.setAnimail(animail);
        List<Cat> catlist = new ArrayList<>();
        catlist.add(cat2);
        catlist.add(cat);
        animail.setCatlist(catlist);
        String json = JSON.toJSONString(animail,SerializerFeature.DisableCircularReferenceDetect);
        System.out.println(json);
    }

    // methods 01 transient
    // @JSONField(serialize=false)
    
    // Date to Json
    @Test
    public void DateToJson(){
        StudentInfo studentInfo = new StudentInfo();
        studentInfo.setBirthday(new Date());
        studentInfo.setId(1);
        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
        String json = JSON.toJSONString(studentInfo,SerializerFeature.WriteDateUseDateFormat);
        System.out.println(json);
    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。