Android使用Gson解析JSON格式

1.json简介与范例

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。 类似于XML,都是通用数据交换格式,但是具有比XML更高的传输效率。
 
JSON的规则比较简单:
1) 并列的数据之间用逗号(”,”)分隔。
2) 映射用冒号(”:”)表示。
3) 并列数据的集合(数组)用方括号(“[]”)表示。
4) 映射的集合(对象)用大括号(”{}”)表示。

Json结构示意

以下写三个实例让便于大家理解:
json对象:

       // 简单的JSON对象
        {
        "id":1000,
        "pageid":02,
        "name":"Jason",
        "age":23
     }

JsonArray:

     ["吃饭","睡觉","打豆豆"]

Json复合结构:

//使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“client”对象,在“client”对象中包含了一个客户数组,而客户数组中的值又是JSON对象
    {
         "client":
       [
         {"name":"jason","age":23}, 
         {"name":"watson","age":20}
       ]
    }

2.Gson的使用

Gson提供了两个重要的方法:toJson()和fromJson()方法。
其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换为相应的Java对象。
这两个方法最重要的地方就是构造好实体类和json串呼应。

2.1 toJson()方法

toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:

  (1)String toJson(JsonElement jsonElement);

  (2)String toJson(Object src);

  (3)String toJson(Object src, Type typeOfSrc);

其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;
方法(2)用于将指定的Object对象序列化成相应的JSON数据;
方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。

2.2 fromJson()方法

fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:

  (1) T fromJson(JsonElement json, Class classOfT);

  (2) T fromJson(JsonElement json, Type typeOfT);

  (3) T fromJson(JsonReader reader, Type typeOfT);

  (4) T fromJson(Reader reader, Class classOfT);

  (5) T fromJson(Reader reader, Type typeOfT);

  (6) T fromJson(String json, Class classOfT);

  (7) T fromJson(String json, Type typeOfT);

以上的方法用于将不同形式的JSON数据解析成Java对象。

2.3 实际测试代码

接下来的代码就是对Gson的这两个方法的测试和应用:
老规矩,先上图片:
这里写图片描述

两个按钮,作为两个方法的转换测试。

生成两个bean对象,Person中嵌套有Address
Address.java

package com.usegson.Bean;

/**
 * 人详细中的地址模块独立出来
 * 为观察复合结构的json串格式
 * 主要是一些geter setter 方法
 * Created by Administrator on 2015/8/30.
 */
public class Address {

    private String street;
    private String city;
    private String country;

    public Address(String street, String city, String country) {
        super();
        this.street = street;
        this.city = city;
        this.country = country;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String toString() {
        return  "Address [street=" + street + ", city=" + city + ", country="+ country + "]";
    }
}

Person.java

package com.usegson.Bean;

/**
 * 人物信息
 * 主要是一些geter setter 方法
 * 嵌套了地址Address
 * Created by Administrator on 2015/8/30.
 */
public class Person {
    private String name;
    private int age;
    private boolean male;
    private Address address;

    public Person(String name, int age, boolean male, Address address) {
        super();
        this.name = name;
        this.age = age;
        this.male = male;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public boolean isMale() {
        return male;
    }

    public void setMale(boolean male) {
        this.male = male;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", male=" + male
                + ", address=" + address + "]";
    }
}

MainActivity

package com.usegson;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.gson.Gson;
import com.usegson.Bean.Address;
import com.usegson.Bean.Person;

/**
 *  简单地演示gson的fromJson和toJson的用法
 */
public class MainActivity extends AppCompatActivity {

    private Person person;   // 人物类
    private Button btntojson;  // tojson按钮
    private Button btnfromjson;  // frojson按钮
    private TextView tv; //文本

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化相关控件
        init();

        // 设置为final,好作为引用
        final Gson gson=new Gson();
        // 方便起见,将init中实例化的pesrson先转化为json串格式存作字符串
        final String s1=gson.toJson(person);

        // tojson的监听
        btntojson.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 转化已经在前面实现了,实际中应该是接收服务器的字符串
                tv.setText(s1);
            }
        });


        // fromjson的监听
        btnfromjson.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // s1已经是JSON格式的了,模拟服务器传过来的json数据
                // 将json格式按昭Person中的定义形式输出
                tv.setText(gson.fromJson(s1,Person.class).toString());
            }
        });

    }

    private void init() {
        btntojson= (Button) findViewById(R.id.button1);
        btnfromjson= (Button) findViewById(R.id.button2);
        tv= (TextView) findViewById(R.id.tv);
        // 直接传入参数,构造person实例
        person=new Person("Jason",23,true,new Address("CH","CD","CN"));
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

主界面就是两个button,一个textview,设置监听,点击两个按钮实现textview的显示文本转化。明天我会贴上图。
这只是最简单的实现。后面我再对json数组进行解析一下,使程序更为丰满。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值