zoukankan      html  css  js  c++  java
  • FastJson基本使用

    在发展中Android的过程中。假设我们常与server联系,更新数据等,然后,json它必须是一个良好的数据格公式,但随着json。使用原生的解析也能够,可是非常不高效,所以这里介绍两种json数据解析的方式,一种是FastJSon ,这个是阿里巴巴出的,号称最快的解析速度。另外一种使我们伟大的Google提供的Gson 来解析json,两个解析json都非常方便,并且都非常强大,在我使用中,基本上都满足了我的需求,以下简单就接受一下,我们的用法。

    首先建立两个实体类。Student.java 和 Teacher.java 

    Student.java 和Teacher.java 的代码例如以下:

    package com.android.fastjson.bean;
    
    public class Student {
    	
    	private int id;
    	private String name;
    	private int age;
    	
    	/**
    	 * 默认的构造方法必须不能省,不然不能解析
    	 */
    	
    	public Student(){
    		
    	}
    	public Student(int id,String name,int age) {
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	@Override
    	public String toString() {
    		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
    	}
    	
    }
    

    package com.android.fastjson.bean;
    
    import java.util.List;
    
    public class Teacher {
    	
    	private int id;
    	private String name;
    	
    	private List<Student> students;
    	
    
    	/**
    	 * 默认的构造方法必须不能省,不然不能解析
    	 */
    	public Teacher() {
    		
    	}
    	public Teacher(int id,String name) {
    		this.id = id;
    		this.name = name;
    	}
    	
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public List<Student> getStudents() {
    		return students;
    	}
    	public void setStudents(List<Student> students) {
    		this.students = students;
    	}
    	@Override
    	public String toString() {
    		return "Teacher [id=" + id + ", name=" + name + ", mStudents="
    				+ students + "]";
    	}
    	
    	
    }
    

    上面 的代码比較简单,主要就几个属性,这里值得注意的是, 默认的构造函数一定要写,不然是无法解析的。

    (对于fastjson 严格依照JavaBean的规范来,有一点不正确就无法解析,这里一定要切记,每个实体类的属性的get , set 方法必须写,切方法第四个字母必须大写,最好使用Eclipse的source->genreal setters and getters 生成get,set 方法,切记,切记 )。对于Gson 这里就没有这么多的要求了。但不妨依照JavaBean来写,避免一些位置的错误。

    上面主要主要的介绍完了。就開始解析。首先要下载fastjson 和Gson的jar包,这个网上非常多请自行下载。

    首先看 fastjson 的解析

    首先解析一个实体类为json 格式。

    Student student = new Student(0, "Aaron", 24);
    		System.out.println(JSON.toJSONString(student));
    输出结果为:{"age":24,"id":0,"name":"Aaron"}
    输出的json格式与我们的Student中定义的属性事实上是不一致的。这个事实上不影响我们生成以及后面的解析,由于他有严格的get和set方法定义。

    更复杂一点的数据类型也能够非常方便的使用JSON.toJsonString(Object o) 这种方法进行解析成json格式。

    List<Student> students = new ArrayList<Student>();
    		for(int i=0;i<5;i++) {
    			Student stu = new Student(i, "Student" + i, 18 +i); 
    			students.add(stu);
    		}
    解析结果为:
    [{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"},{"age":20,"id":2,"name":"Student2"},{"age":21,"id":3,"name":"Student3"},{"age":22,"id":4,"name":"Student4"}]
       我们来看看更复杂一点的结构。

      我们将一个Teacher 列表来解析。一个Teacher对象中是包括Student 列表的这个也在我们经常使用的数据模型,以下看看代码:

    List<Teacher> teaList = new ArrayList<Teacher>();
    		long time = System.currentTimeMillis();
    		for(int i=0;i<10;i++) {
    			Teacher teacher = new Teacher(i, "Teacher " + i);
    			List<Student> stus = new ArrayList<Student>();
    			for(int j = 0 ;j<4;j++) {
    				Student s = new Student(j, "Student" + j, 18 +j); 
    				stus.add(s);
    			}
    			teacher.setStudents(stus);
    			teaList.add(teacher);
    		}
    		String jsonTeach = JSON.toJSONString(teaList);
    		System.out.println("fastjson = " + jsonTeach);

    结果为:

    fastjson = [{"id":0,"name":"Teacher 0","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":1,"name":"Teacher 1","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":2,"name":"Teacher 2","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":3,"name":"Teacher 3","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]}]
     还是一个简单的函数而已,就能办到。
    这个还有toJSONString 重载的方法,有非常多。在给一个就是能够依照标准的json 格式输出,上面的输出都不规范,我们来看看,
    Student student = new Student(0, "Aaron", 24);
    		System.out.println(JSON.toJSONString(student,true));
    输出为:
    {
    "age":24,
    "id":0,
    "name":"Aaron"
    }


    
    

    假设我们想要将实体类中的某个字段或某几个不进行解析呢?那么我们能够使用transient keyword,来标记它为不须要的,在fastjson中还提供了一种便捷的方法来自己定义我们须要序列化的字段。

    SimplePropertyPreFilter filter = new SimplePropertyPreFilter(实体类.class, "字段1","字段2"); 字段为我们须要序列化的字段,假设实体类中没有改字段则不解析放弃该字段而不会报错。

    例如以下:

    SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Student.class, "id","age");
    		String jsonStu =JSON.toJSONString(students,filter);
    这样就仅仅会序列化 id和age 的字段。

    
    

    以下进行fastjson 的反序列化。这个也是非经常常使用的功能。

    还是拿最简单的来进行示范。

    Student student = new Student(0, "Aaron", 24);
    		String str = JSON.toJSONString(student,true);
    		System.out.println(JSON.parseObject(str,Student.class));
    反序列化主要使用的是JSON.parseObject(str,class); 它就能把我们的str 转化为class 类型的对象,当然还有更复杂的对象,比方:

    		List<Student> students = new ArrayList<Student>();
    		for(int i=0;i<5;i++) {
    			Student stu = new Student(i, "Student" + i, 18 +i); 
    			students.add(stu);
    		}
    		// 过滤哪些属性须要转换
    //		SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Student.class, "id","age");
    //		String jsonStu =JSON.toJSONString(students,filter);
    		String jsonStu =JSON.toJSONString(students);
    		System.out.println(jsonStu);
    		
    		List<Student> stu =JSON.parseObject(jsonStu, new TypeReference<List<Student>>(){});
    		for(int i=0;i<stu.size();i++) 
    		{
    			System.out.println(stu.get(i));
    		}
    前面就是加入数据,然后在后面解析为json格式,然后在转化为类的对象,这里转为List<Student> 对象,主要用到new TypeReference<数据返回类型> (){},我们使用的就是new TypeReference<List<Student>>(){} 返回的结果就是List<Student> 也不须要强制转化,我们看看上面输出的结果为:

    Student [id=0, name=Student0, age=18]
    Student [id=1, name=Student1, age=19]
    Student [id=2, name=Student2, age=20]
    Student [id=3, name=Student3, age=21]
    Student [id=4, name=Student4, age=22]

    当然fastjson 能处理的数据类型还有非常多非常多,我主要列了我经常使用的数据类型,今天主要就说到这里。


    后面我会将也简介下Gson 的基本使用。然后在和fastjson进行对照,看看时间是否真的比gson 快6倍。

    好久没有写博客了,文採一般,但希望大家可以喜欢,多提意见,一起进步。什么每个人都想知道,你也可以留言,慢慢学习在我身后。然后评论。

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    DevOps工具链
    内网穿透工具
    SVN无法检出项目
    IDEA安装插件
    实习过程中学到关于各版本操作系统的知识(2)
    实习过程中学到关于各版本操作系统的知识(1)
    lib1funcs.S(用于解决裸板实现 printf 中的问题: undefined reference to `__aeabi_uidivmod' 和 undefined reference to `__aeabi_uidiv')
    交叉编译工具参数笔记
    vim 源码安装
    Git clone 下载慢解决方案
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4823245.html
Copyright © 2011-2022 走看看