Android使用Gson解析JSON格式

来源:互联网 发布:linux spi驱动移植 编辑:程序博客网 时间:2024/06/08 04:49

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数组进行解析一下,使程序更为丰满。

0 0
原创粉丝点击