JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。 类似于XML,都是通用数据交换格式,但是具有比XML更高的传输效率。
JSON的规则比较简单:
1) 并列的数据之间用逗号(”,”)分隔。
2) 映射用冒号(”:”)表示。
3) 并列数据的集合(数组)用方括号(“[]”)表示。
4) 映射的集合(对象)用大括号(”{}”)表示。
以下写三个实例让便于大家理解:
json对象:
// 简单的JSON对象
{
"id":1000,
"pageid":02,
"name":"Jason",
"age":23
}
JsonArray:
["吃饭","睡觉","打豆豆"]
Json复合结构:
//使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“client”对象,在“client”对象中包含了一个客户数组,而客户数组中的值又是JSON对象
{
"client":
[
{"name":"jason","age":23},
{"name":"watson","age":20}
]
}
Gson提供了两个重要的方法:toJson()和fromJson()方法。
其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换为相应的Java对象。
这两个方法最重要的地方就是构造好实体类和json串呼应。
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数据。
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对象。
接下来的代码就是对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数组进行解析一下,使程序更为丰满。