利用java反射机制解析json

前言

刚工作的时候接手了前辈留下的一个项目,客户端和服务器交互使用的是xml格式数据,虽然已有成熟的解析技术,但是使用起来还是感觉不尽人意,加上老大提出要尽量减少每次交互的数据量,以节省用户流量和服务器带宽,于是换成json数据格式刻不容缓,我也由此开始认识到Json。

Json基础

先看一个Json数据:

{
 "persons":[
		{
			"name":"Bob",
			"age":14,
			"married":false,
			"salary":null
		},
		{
			"name":"Kate",
			"age":26,
			"married":true,
			"salary":8888.88
		}
	],
 "team":"Android"
}

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。结合上面的例子,Json的数据是由键值对的形式存放的,键值间采用冒号:分割,其中键用双引号"或单引号'引起,数据或数组元素间使用逗号,分割,方括号[]表示对象数组,花括号{}表示每一个对象。Json的取值有很多种,可以是数字(整数或浮点数)、字符串(双引号或单引号中)、逻辑值(true或false)、json数组(方括号中)、json对象(花括号中)或者空值(null)。

弄清大概后我们再来看看上例中的Json,它表示一个包含有persons数组和team变量的对象,persons数组又包含了两个人员对象,它们具有相同的属性,其中名字name的值是字符串,年龄age的值是整数,已婚married的值是逻辑值,薪水salary是空值或浮点数。我们可以理解成Android小组有Bob和Kate两个成员。

Java反射机制基础

Java是一门很强大的语言,它的反射机制几乎让程序猿们可以为所欲为,刚理解完反射机制的时候我感觉自己掌握了一门不可思议的技术,逼格一下提高了一个档次,然后大神告诉我图样图森破,后来我才发现自己激动过火儿了,因为java程序猿一般都会告诉我:不认识女人,还能不认识反射吗。那么什么是反射机制?反射机制(Java Reflection)是在java运行状态中可以动态地解析一个类的结构,调用一个类的属性和方法,甚至可以修改一个类的私有private属性的值等的一种机制。怎么样,有没有操作内存的感觉!

由于反射机制的东西太多,这里只简单讲解下我们用反射解析json时用到的东西。照样是先看一个例子:

package test.reflection;

/**
 * Created by Chelly on 15/9/23.
 */
public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
    /**
     * 婚否
     */
    private boolean married;
    /**
     * 工资
     */
    private double salary;

    public Person() {
    }

    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;
    }

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", married=" + married +
                ", salary=" + salary +
                '}';
    }

    /**
     * 自我介绍
     *
     * @param ending 结束语
     */
    private void introduce(String ending) {
        StringBuilder sb = new StringBuilder();
        sb.append("Hi,I'm " + getName() + "!");
        sb.append("I'm " + getAge() + " years old!");
        sb.append("I'm " + (isMarried() ? "" : "not ") + "married!");
        sb.append(ending == null ? "" : ending);
        System.out.println(sb.toString());
    }
}

这是一个Person类,有name、age、married、salary四个私有属性,由于大家都比较害羞,连自我介绍方法introduce也是私有的,为了让团队熟悉起来,我们要鼓励大家自我介绍,那我们先拿年纪最小的Bob开刀吧!为了打开小Bob的心扉,我们暂时先把Person类的introduce函数改成public的公有方法,然后让小Bob自己练习下自我介绍:

package test.reflection;

import android.app.Activity;
import android.os.Bundle;

/**
 * Created by Chelly on 15/9/23.
 */
public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //先初始化Bob
        Person person = new Person();
        person.setName("Bob");
        person.setAge(14);
        person.setMarried(false);
        person.setSalary(0f);
        //让Bob做自我介绍
        person.introduce("I'm shy!");
    }
}

执行上面的代码打印结果如下:


由于Bob自己承认了很害羞,他只愿意开口自我介绍一次,所以我们再把Person的introduce函数改成私有private方法,大家又变的害羞了,接着我们要想办法用反射机制让大家再次开口自我介绍,并且我们还会在大家的名字加上Little字样以显得亲切,这样我们需要对运行时Person的实例进行如下操作了:

package test.reflection;

import android.app.Activity;
import android.os.Bundle;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Chelly on 15/9/23.
 */
public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInsta
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值