使用开源工具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()等等
JsonReader和JsonWriter类(不常用)
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