目录
目录
一、Gson介绍
Gson是Google提供的一个Java库,用于将Java对象转换为JSON格式数据或将JSON格式数据转换为Java对象。
1、常用方法:
toJson(Object object)
:将Java对象转换为JSON字符串。该方法接受一个Java对象作为参数,并返回对应的JSON字符串。例如:
Person person = new Person("John", 25);
String json = gson.toJson(person);
fromJson(String json, Class<T> classOfT)
:将JSON字符串转换为Java对象。该方法接受一个JSON字符串和目标对象的Class类型作为参数,并返回对应的Java对象。例如:
String json = "{\"name\":\"John\",\"age\":25}";
Person person = gson.fromJson(json, Person.class);
toJsonTree(Object object)
:将Java对象转换为JsonElement对象。JsonElement对象是Gson库中表示JSON元素的抽象类,可以进一步操作或处理。例如:
Person person = new Person("John", 25);
JsonElement jsonElement = gson.toJsonTree(person);
fromJson(JsonElement json, Class<T> classOfT)
:将JsonElement对象转换为Java对象。该方法接受一个JsonElement对象和目标对象的Class类型作为参数,并返回对应的Java对象。例如:
JsonElement jsonElement = JsonParser.parseString("{\"name\":\"John\",\"age\":25}");
Person person = gson.fromJson(jsonElement, Person.class);
toJson(JsonElement jsonElement)
:将JsonElement对象转换为JSON字符串。该方法接受一个JsonElement对象作为参数,并返回对应的JSON字符串。例如:
JsonElement jsonElement = JsonParser.parseString("{\"name\":\"John\",\"age\":25}");
String json = gson.toJson(jsonElement);
2、 Gson的注解:
-
@SerializedName
:用于指定字段或方法在序列化和反序列化时的名称。当Java类中的字段名与JSON中的键名不一致时,可以使用该注解来进行映射。 -
@Expose
:用于标记字段或方法是否参与序列化和反序列化。默认情况下,Gson会将所有非transient的字段都包含在序列化和反序列化的过程中。通过添加@Expose
注解,可以控制只有被标记的字段才会被处理。 -
@Since
和@Until
:用于标记字段或方法在特定版本范围内是否参与序列化和反序列化。@Since
注解指定了字段或方法在某个特定版本之后生效,而@Until
注解指定了字段或方法在某个特定版本之前生效。 -
@JsonAdapter
:用于指定自定义的TypeAdapter类,来控制字段或方法的序列化和反序列化过程。通过自定义TypeAdapter,可以实现更灵活的转换逻辑。
二、使用方法
Gson是Google提供的一个用于将Java对象与JSON数据进行互相转换的开源库。下面是使用Gson的详细方法:
1. 添加依赖
在你的Android项目中,需要在build.gradle文件中添加以下依赖:
dependencies {
implementation 'com.google.code.gson:gson:2.8.7'
}
2. 创建Java类
首先需要创建一个Java类,这个Java类将与JSON对象进行互相转换。以下示例代码展示了一个Java类的基本结构:
package com.example.gsondemo;
public class Student {
private String id;
private String name;
private int age;
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. 将Java对象转换为JSON字符串
使用Gson可以将Java对象序列化为JSON字符串。以下示例代码展示了如何使用Gson将User对象转换为JSON字符串:
Student student = new Student();
student.setId("001");
student.setName("xiaoming");
student.setAge(18);
student.setSex("男");
// 将对象转成json数据
String jsonStr = gson.toJson(student);
下面是转化后的json数据
{
"id":"001",
"name":"xiaoming",
"age":18,
"sex":"男"
}
4. 将JSON字符串转换为Java对象
使用Gson可以将JSON字符串反序列化为Java对象。以下示例代码展示了如何使用Gson将JSON字符串转换为User对象:
// 将对象转成json数据 String jsonStr = gson.toJson(student); // 将json解析成对象数据 Student s = gson.fromJson(jsonStr,Student.class); et5.setText(s.getId()+" "+s.getName()+" "+s.getAge()+" "+s.getSex());
通过以上几步,您就可以使用Gson轻松地将Java对象与JSON数据进行互相转换。
完整代码:
MainActivity:
package com.example.gsondemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
Button btn;
EditText et1,et2,et3,et4,et5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Gson gson= new Gson();
Student student = new Student();
student.setId("001");
student.setName("xiaoming");
student.setAge(18);
student.setSex("男");
// 将对象转成json数据
String jsonStr = gson.toJson(student);
et1.setText(jsonStr);
// 第二种列表数据
List<String> list = Arrays.asList("1","ad","12","134");
et2.setText(gson.toJson(list));
// 第三种映射对象
Map<String,Object> content = new HashMap<>();
content.put("id","002");
content.put("name","xiaohua");
content.put("sex","女");
content.put("age",18);
et3.setText(gson.toJson(content));
// 使用GSON的fromJson方法
// 解析复杂数据需要Type来解析或生成JSON数据。
Type type = new TypeToken<ArrayList<String>>(){}.getType();
ArrayList<String> sList = gson.fromJson(list.toString(),type);
et4.setText(sList.toString());
// 将json解析成对象数据
Student s = gson.fromJson(jsonStr,Student.class);
et5.setText(s.getId()+" "+s.getName()+" "+s.getAge()+" "+s.getSex());
}
});
}
private void initView() {
btn = findViewById(R.id.btn);
et1 = findViewById(R.id.et1);
et2 = findViewById(R.id.et2);
et3 = findViewById(R.id.et3);
et4 = findViewById(R.id.et4);
et5 = findViewById(R.id.et5);
}
}
布局:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:paddingTop="16dp"
android:paddingRight="16dp"
android:paddingLeft="16dp"
android:paddingBottom="16dp"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/btn"
android:layout_alignParentTop="true"
android:text="GSON TEST"/>
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/et1"
android:text="FromObjectToJsonData"
android:layout_below="@+id/textView1"
android:layout_marginTop="11dp"
android:inputType="textPersonName"/>
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/et2"
android:text="FromListDataToJsonData"
android:layout_below="@+id/et1"
android:inputType="textPersonName"
android:ems="10"/>
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/et3"
android:text="FromMapDataToJsonData"
android:layout_below="@+id/et2"
android:layout_marginTop="11dp"
android:inputType="textPersonName"/>
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/et4"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="FromJsonToComplexData"
android:layout_below="@+id/textView2"
android:inputType="textPersonName"
android:ems="10"/>
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/et5"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="FromJsonToObjectData"
android:layout_below="@+id/textView2"
android:ems="10"/>
</LinearLayout>
Student在上面。