• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Android-json数据解析之Gson和FastJson

android 搞代码 4年前 (2022-03-01) 29次浏览 已收录 0个评论

Android json数据解析之Gson和FastJson的应用

一:Gson应用

Gson是谷歌提供的一个开源库,能够用来解析JSON数据。
1.什么是json
json就是用来进行网络数据传输的一种格局,目前的应用很宽泛,其格局就是一种键值对的模式,很不便进行解析。json有Json对象(JsonObject)和Json数组(JsonArray)两种模式。但凡以{}就是一个Json对象,但凡[]就是一个Json数组。

{//一个Json对象
 "user": "user1",
  "pwd": "123456"
}
{//这个对象有4个字段,其中一个是数组
  "user": "user1",
   "pwd": "123456",
   "jsonArray": [//一个Json数组外面有2个Json对象,每个Json对象有2个字段
             {"user": "user1",
               "pwd": "123456"},
      
              {"user": "user2",
              "pwd": "123456"}
                        ],
   "result": "胜利"            
}

2.增加Gson依赖
这是github上19.1kStar我的项目

在app下build.gradle增加依赖
implementation ‘com.google.code.gson:gson:2.8.6’
3.应用GsonFormat工具
Gson是采纳对象映射的形式,所有要为JSON数据创立一个Java对象来与之对应。
1.装置GsonFormat插件
2.新建一个类,在类外面按Alt+S键,并将要转换的Json数据复制进去
4.Gson应用

public class User implements Serializable {
    /**
 * user : user1 * pwd : 123456 * jsonArray : [{"user":"user1","pwd":"123456"},{"user":"user2","pwd":"123456"}] * result : 胜利
 */
 private String user;
 private String pwd;
 private String result;
 private List<JsonArrayBean> jsonArray;
 public static class JsonArrayBean implements Serializable {
        /**
 * user : user1 * pwd : 123456 */
 private String user;
 private String pwd;
 public String getUser() {
            return user;
 }
        public void setUser(String user) {
            this.user = user;
 }
        public String getPwd() {
            return pwd;
 }
        public void setPwd(String pwd) {
            this.pwd = pwd;
 }
    }
    public String getUser() {
        return user;
 }
    public void setUser(String user) {
        this.user = user;
 }
    public String getPwd() {
        return pwd;
 }
    public void setPwd(String pwd) {
        this.pwd = pwd;
 }
    public String getResult() {
        return result;
 }
    public void setResult(String result) {
        this.result = result;
 }
    public List<JsonArrayBean> getJsonArray() {
        return jsonArray;
 }
    public void setJsonArray(List<JsonArrayBean> jsonArray) {
        this.jsonArray = jsonArray;
 }
}

解析JSON对象

String jsonData="要解析的Json字符串";
Gson gson=new Gson();
User user=gson.fromJson(jsonData, User.class);
String result=user.getResult();
Log.d("aa",result);
===========
aa: 胜利

解析Json对象外面的数组

  // 因为jsonArray字段对应的是一个JSON数组,所以要用一个List来对应
List<User.JsonArrayBean> jsonArrayBeans=user.getJsonArray();
//取值
for (int i=0;i<jsonArrayBeans.size();i++){
  User.JsonArrayBean jsonArrayBean=jsonArrayBeans.get(i);
 String u=jsonArrayBean.getUser();
 Log.d("bb",u);
 ================
 取到的值
bb: user1
bb: user2

解析纯数组

[
    {"user": "user8",
      "pwd": "123456"},
      
      {"user": "user9",
      "pwd": "123456"}
]
//应用形式
Gson gson=new Gson();
List<Data> datas=gson.fromJson(jsonData, new TypeToken<ArrayList<Data>>(){}.getType());
for (int i=0;i<datas.size();i++){
  Data data=datas.get(i);
 String u=data.getUser();
 Log.d("cc",u);
}
//打印后果
cc: user8
cc: user9

序列化对象成Json(Teacher对象下4个属性 age,email,isDeveloper,name)

Gson gson=new Gson();
Teacher teacher=new Teacher("Rocky","[email protected]",22,true);
String teacherJson=gson.toJson(teacher);
Log.d("bb",teacherJson);

打印后果
 bb {"age":22,"email":"[email protected]","isDeveloper":true,"name":"Rocky"}

如果变量为空值的话序列化和反序列化
1.可见某个变量为null时,Gson在序列化的时候间接把这个变量疏忽了
2.对于JSON字符串里没有的变量,Gson在反序列化时会给它一个默认值,int类型默认为0,bool类型默认为false,String类型默认为null

Gson gson=new Gson();
Teacher teacher=new Teacher("Rocky",null,22,true);
String teacherJson=gson.toJson(teacher);
Log.d("bb",teacherJson);


管制序列化/反序列化的变量名称
以Teacher对象为例,如果JSON字符串的变量名name变成fullName,无需缓和,咱们也不必把Teacher对象的变量name改成fullName,而后把get,set办法全改了。只须要用Gson提供的注解@SerializedName就行。

public class Teacher{
@SerializedName("fullName")
//@SerializedName(value = "name", alternate = "fullName")
//然而事实远比设想中简单,这个JSON有时候传的是`fullName`,有时候传的是`name`,这时该怎么办呢? 不必放心,`@SerializedName` 承受两个参数,`value` 和 `alternate` ,顾名思义,`alternate` 是备选变量名
private String name;
private String email;
private int age;
private boolean isDeveloper;
}
打印Json后果
{"age":22,"isDeveloper":true,"fullName":"Rocky"}

序列化/反序列化过程中疏忽某些变量

public class Teacher  {
    @SerializedName("fullName")
    private String name;
 private String email;
 //@Expose()参加序列化和反序列化
 //@Expose(serialize = false)不参加序列化,只参加反序列化
 // @Expose(deserialize = false)只参加序列化,不参加反序列化
 @Expose(serialize = false,deserialize = false)//序列化和反序列化都不参加
 private int age;
 private boolean isDeveloper;
 }

然而:要应用这个注解来管制序列化和反序列化,就不能应用默认的Gson对象

//Gson gson=new Gson();不能通过这种形式构建Gson对象
GsonBuilder builder=new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
//builder.setPrettyPrinting();
Gson gson=builder.create();
Teacher teacher=new Teacher("Rocky","[email protected]",22,true);
String teacherJson=gson.toJson(teacher);
Log.d("bb",teacherJson);
打印后果
bb: {}  我不晓得为什么这种形式呈现的后果是空,按理说我只是限定一个属性的序列化形式依照网上说的形式构建的Gson也不能
我把builder.excludeFieldsWithoutExposeAnnotation();换成builder.setPrettyPrinting();能够打印进去
然而没有限度字段的序列化和反序列化

形式二:transient字段
 通过private transient int age;
 
  Gson gson=new Gson();
 Teacher teacher=new Teacher("Rocky","[email protected]",22,true);
 String teacherJson=gson.toJson(teacher);
 Log.d("bb",teacherJson);
 打印后果
{"email":"[email protected]","isDeveloper":true,"fullName":"Rocky"}

二:FastJson应用
FastJson是一个Java语言的编写的高性能的Json处理器,由阿里巴巴公司开发的,github上23kStar

1.增加依赖
implementation ‘com.alibaba:fastjson:1.2.73’
2.序列化Json,把对象转成Json串调用JSON.toJSONString

tudent student=new Student("Mike",12);
String studentJson =JSON.toJSONString(student,true);//为true就是要格式化Json,flase就是非格式化Json
//Gson的builder.setPrettyPrinting();格式化Json
Log.d("aa",studentJson);
打印后果:
aa: {
        "age":12,
        "name":"Mike"
    }

3.反序列化Json,把Json串转成对象JSON.parseObject

String json = "{"age":18, "name":"Rocky"}";
Student student=JSON.parseObject(json,Student.class);//要记得Student 增加一个无参的构造方法
Log.d("bb",student.getName());
Log.d("bb",student.getAge()+"");

打印后果
bb: Rocky
bb: 18

如果没有无参的构造方法会报谬误

Json转成简单的Bean,如List ,Set,Map

public class Student {
 private String name;
 private int age;
 ....疏忽get,set办法
 }
一:List形式
String json = "[{"age":18, "name":"Rocky"},{"age":19, "name":"jack"}]";
List<Student> lists=JSON.parseObject(json,new TypeReference<ArrayList<Student>>(){});
for (int i=0;i<lists.size();i++){
    Student student=lists.get(i);
 Log.d("cc",student.getName());
 Log.d("cc",student.getAge()+"");
}

二:Set形式
String json = "[{"age":18, "name":"Rocky"},{"age":19, "name":"jack"}]";
Set<Student> lists=JSON.parseObject(json,new TypeReference<HashSet<Student>>(){});
for (Student student:lists){
    Log.d("cc",student.getName());
 Log.d("cc",student.getAge()+"");
}
打印后果
cc: Rocky
cc: 18

cc: jack
cc: 19

@JSONField注解的应用
1.作用于get办法上:当把注解作用于get办法上的时候,在把Java对象转化成Json字符串的时候,Java对象中的字段名会转化为注解中的name指定的字段名。

@JSONField(name = "myAge")
public int getAge() {
    return age;
}

Student student=new Student();
student.setAge(15);
student.setName("Rock");
String studentJson =JSON.toJSONString(student,true);
Log.d("aa",studentJson);

打印后果
aa: {
        "myAge":15,//变成咱们正文的属性名
        "name":"Rock"
    }

2 作用于set办法上:在把json字符串转化成java对象的时候,注解中的name指定的字段名会映射为Java对象中的字段名。

@JSONField(name = "myName")
public void setName(String name) {
    this.name = name;
}

 String json = "{"age":2,"myName":"ss"}";//这个Json串的属性换成标记的
Student student= JSON.parseObject(json,Student.class);
 Log.d("cc",student.getName());
 Log.d("cc",student.getAge()+"");
 
 打印后果
 cc: ss
 cc: 2

3 @JSONField作用于java类的字段上

public class Student {
    @JSONField(name = "name", alternateNames = {"myName", "meName"})
    private String name;
 private int age;
 }
 
  String json = "{"age":2,"meName":"ss"}";//这个name字段能够是myName,也能够是meName都能够映射到name字段上
Student student= JSON.parseObject(json,Student.class);
 Log.d("cc",student.getName());
 Log.d("cc",student.getAge()+"");
 
 打印后果
 cc: ss
 cc: 2

Java Bean对象与JSONObject 对象互相转换
Java Bean对象—>JSONObject对象—>json字符串

 student.setAge(15);
 student.setName("Rock");
 JSONObject jsonObject= (JSONObject) JSON.toJSON(student);//JSONObject对象
 String studentJson= jsonObject.toJSONString();//转成Json字符串,toString()也能够
 Log.d("aa",studentJson);

json字符串与JSONObject对象转换
json字符串—>JSONObject对象

String json = "{"age":2,"meName":"ss"}";
JSONObject studentObject= JSON.parseObject(json);

json字符串转成Java汇合能够间接应用JSON.parseArray()

String json = "[{"age":18, "name":"Rocky"},{"age":19, "name":"jack"}]";
List<Student> lists=JSON.parseArray(json,Student.class);
for (Student student:lists){
    Log.d("cc",student.getName());
 Log.d("cc",student.getAge()+"");
}

END:所求皆吾愿,所行化坦途


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Android-json数据解析之Gson和FastJson

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址