Json的生成和读取(Gson)

使用开源工具Gson

先在gradle中添加依赖

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}

生成Json:

1.创建实体类

Result,PersonData,SchoolInfo三个类,具体代码就懒得放了

2.实体类赋值

Result result=new Result();
result.setResult(1);
PersonData personData=new PersonData();
personData.setName("nate");
personData.setAge(12);
personData.setUrl("https://www.imooc.com/video/8331");
List<SchoolInfo> schoolInfos =new ArrayList<SchoolInfo>();
SchoolInfo schoolInfo1=new SchoolInfo();
schoolInfo1.setSchool_name("清华");
SchoolInfo schoolInfo2=new SchoolInfo();
schoolInfo2.setSchool_name("北大");
schoolInfos.add(schoolInfo1);
schoolInfos.add(schoolInfo2);
personData.setSchoolInfos(schoolInfos);
result.setPersonData(personData);

3.Gson根据实体类生成Json数据

Gson gson=new Gson();
String js=gson.toJson(result);

 

 

解析Json:

1.创建实体类

2.获取json

3.解析json到实体类

Gson gson=new Gson();

Person person=gson.from(jsonData,Person.class)

Json数组:

List<Person> people=gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType())

4.从实体类中读取数据

String name=person.getName();

 

细节

Json数组的情况(参数化类型)

Type listType = new TypeToken<List<String>>() {}.getType();

List<String> target = new LinkedList<String>();

target.add("first");

target.add("second");

target.add("third");

Gson gson = new Gson();

//生成和解析的时候都要加入Type参数

String json = gson.toJson(target, listType);

List<String> target2 = gson.fromJson(json, listType);

Json漂亮的格式化:

Gson提供的默认JSON输出是一种紧凑的JSON格式。这意味着输出JSON结构中没有任何空格。如果您想使用漂亮的打印特性,您必须使用GsonBuilder配置您的Gson实例。

 

Gson gson = new GsonBuilder().setPrettyPrinting().create();

String jsonOutput = gson.toJson(someObject);

 

 

空字段以null的形式显示,Here's how you would configure a Gson instance to output null:

Gson gson = new GsonBuilder().serializeNulls().create();

 

Gson中实现的默认行为是忽略null对象字段。这允许更紧凑的输出格式;但是,当JSON格式转换回Java表单时,客户端必须为这些字段定义一个默认值。

 

 

 

版本控制

Since(1.0)自1.0开始启用, .setVersion(2.0)大于等于1.0可以用,.setVersion(0.5)小于等于1.0不能使用

Until(1.0)自1.0开始弃用, .setVersion(0.5)小于等于1.0可以用, .setVersion(2.0)大于等于1.0不能使用

 

 

名称设定

@SerializedName(value="name1", alternate={"name2", "name3"})

value序列化反序列化的名称,alternate反序列化的代替名称

public class Json1{

    //反序列化时class和anotherclass都可以匹配
    @SerializedName(value="class" alertname="anotherclass")
    private String cla;
    @SerializedName("public") 
    private String pub;
}

序列化得到下面的json 

{
    "class":"1"
    "public":"2"
}

(反序列化时多个名称同时匹配,则赋值为最后一个的值)

___________________________________分割线______________________________________

Gson有哪些东西:

注释5

Since(1.0)自1.0开始启用, .setVersion(2.0)大于等于1.0可以用

Until(1.0)自1.0开始弃用, .setVersion(0.5)小于等于1.0可以用

重要,常用

@SerializedName(value="name1", alternate={"name2", "name3"})

value序列号反序列化的名称,alternate反序列化的代替名称

 

@JsonAdapter不常用,不会

用于自动注册自定义序列化操作

 

@Expose (serialize = true, deserialize = false)

设置是否允许属性序列号反序列化

 @Expose默认均为true, @Expose未备注默认均为false

配合Gson g=GsonBuilder.excludeFieldsWithoutExposeAnnotation()才能生效

 

Gson类

这是使用Gson的主要类。Gson通常是先构造一个Gson实例,然后在其上调用toJson(Object)或fromJson(String, Class)方法。Gson实例是线程安全的,因此您可以跨多个线程自由地重用它们。如果只需要默认配置,可以通过调用new Gson()来创建一个Gson实例。您还可以使用GsonBuilder构建一个具有各种配置选项的Gson实例,比如版本控制支持、漂亮的打印

主要就构造,toJson,fromJson3个方法

GsonBuilder类

GsonBuilder最好的使用方式是创建它,然后调用它的各种配置方法,最后调用create。

serializeNulls()        setVersion(1.0)      setPrettyPrinting()等等

JsonReaderJsonWriter类(不常用)

http://www.javadoc.io/doc/com.google.code.gson/gson/2.8.5(示例)

用于读取Json文件/输出Json格式到文件

JsonReader1.构造方法2.begin,end方法3.close方法收尾4.next方法5.peek方法查看next类型,hasnext查看是否有下一个6.Lenient(基本不用)(默认接收Json,设置后忽略部分语法错误)

7.toString,getPath(没什么用)8.Skipvalue跳过值(有用:用于处理未知名称和null值的时候)

JsonWrite1.构造方法2.begin,end方法3.close方法收尾4.name名称value赋值5.nullValue写入空值,jsonValue直接写入值(这个不常用,一般用value)6.setLenient(基本不用)(默认接收Json,设置后忽略部分语法错误)setSerializeNulls(设置null值是否允许序列化)(默认为true)setHtmlSafe(不太懂,配合HTML,xml格式)

7.flush(close自带flush,所以不怎么用)8.setIndent设定缩进字符(不设置则为紧凑的)(有用)

 

 

___________________________________分割线______________________________________

 

重用度高的和复杂的推荐用Gson

使用次数少和简单的JsonArray+JsonObject

 

另一种Json的生成和读取

(JSONArray+JSONObject)

https://blog.csdn.net/yh18668197127/article/details/85059736

猜你喜欢

转载自blog.csdn.net/yh18668197127/article/details/85042064
今日推荐