Json从入门到精通(2)

5.Gson使用
GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。

特点: 1、快速、高效

   2、代码量少、简洁

  3、面向对象

    4、数据传递和解析方便

Gson的pom依赖:

eg:

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.0</version>
    </dependency>

Gson的创建方式:

方法一:Gson gson = new gson();

方法二:通过GsonBuilder(),可以配置多种配置。

Gson的基本用法:
注:JavaBean:

@NoArgsConstructor @AllArgsConstructor @Setter @Getter @ToString @Builder public class PersonJson { private String name; private Integer age; private String hobby; } //hobby是在后面的例子中添加的。要么就name,age两个属性,要么就三个。 //上面的注解是lombok的注解,起到简化Bean类的作用。

Gson提供了public String toJson(Objcet obj)方法,可以将对象转化为json字符串。
eg:

JavaBean转化为json字符串
public class IndexTest {
    PersonJson person;
    @Before
    public void prepare() {
        person = new PersonJson("栗霖",18);
    }

    @Test
    public void index() {
        Gson gson = new Gson();
        System.out.println(gson.toJson(person));
        System.out.println("---------------");
        Gson gson1 = new GsonBuilder().create();
        System.out.println(gson1.toJson(person));
    }
}

Gson提供了public T fromJson(String jsonStr,T.class)方法,可以将json字符串转化为Java对象

json字符串转化为JavaBean
public class SecondTest {
    @Test
    public void index() {
        String jsonStr = "{\"name\":\"栗霖\",\"age\":\"18\"}";
        Gson gson = new GsonBuilder().create();
        PersonJson p = gson.fromJson(jsonStr,PersonJson.class);
        System.out.println("---->jsonStr convert javaBean " + p.getName() + " " + p.getAge());
    }
}
json字符串转化为list集合
public class SecondTest {
    @Test
    public void index() {
        String listJsonStr = "[{\"name\":\"栗霖\",\"age\":\"18\"},{\"name\":\"栗霖之雨\",\"age\":\"18\"}]";
        Gson gson = new GsonBuilder().create();
        List<PersonJson> list = gson.fromJson(listJsonStr,new TypeToken<ArrayList<PersonJson>>(){}.getType());
        System.out.println("---->listJsonStr convert List " + list);
    }
}

创建JsonObject:

可以通过addProperty(String,Object)向JsonObject添加属性,跟hashmap类似。

public class SecondTest {
    @Test
    public void index() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name","栗霖");
        jsonObject.addProperty("age",18);
        System.out.println("---->create jsonObject  " + jsonObject);
    }
}

创建JsonArray

public class SecondTest {
    @Test
    public void index() {
        JsonArray jsonArray = new JsonArray();
        jsonArray.add("a");
        jsonArray.add("b");
        jsonArray.add("c");
        jsonArray.add("d");
        System.out.println("---->create jsonArray: " + jsonArray);
    }
}

JsonObject嵌套数组或者说JsonObject嵌套JsonArray

public class SecondTest {
    @Test
    public void index() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name","栗霖");
        jsonObject.addProperty("age",18);
        JsonArray jsonArray = new JsonArray();
        jsonArray.add("是码农");
        jsonArray.add("以前喜欢玩游戏");
        jsonArray.add("现在只敢小心积累");
        jsonArray.add("只怕突然白了头");
        jsonObject.add("status",jsonArray);
        System.out.println("---->create jsonArray: " + jsonObject);
    }
}

Gson注解
重命名注解:@SerializedName
当你调用其他服务时,他们返回的json KEY值与你的Bean属性名称不对应怎么办?

解决方法:这时候就需要@SerializedName啦。他可以帮助你解决这个问题!

实体类:
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
@Builder

public class PersonJson {
    private String name;
    private Integer age;
    //这里只是随便举个例子,千万不要用中文!!!
    @SerializedName(value = "爱好")
    private String hobby;
}

@serializedName

除了value属性外,还可以使用alternate属性,这个值可以替换前面的值,将传入的json进行修改。

注:value的值不能出现在alternate中,alternate是备选字段。

@SerializedName(value = “hobby”, alternate = {“interest”,“be fond of”})
过滤注解@Expose
注:默认是既可以序列化,也可以反序列化。一定要配合GsonBuilder一起使用

该注解是加在JavaBean的属性上使用的。

配合这个使用哦Gson gson = new GsonBuilder().excludeFieldWithoutExposeAnnotation().create();

四种使用方式:

1)不使用@Expose注解等同于@Expose(deserialize = false, serialize = false)不做任何解析

2)@Expose(deserialize = true, serialize = false)只解析使用,可以反序列化,不可以序列化。

3)@Expose(deserialize = false, serialize = true)可以序列化,不可以反序列化。

4)@Expose(deserialize = false, serialize = true)既可以序列化,也可以反序列化。

注:这里的序列化指:将对象转化为json字符串。反序列化指:将json字符串转化成对象。

版本控制注解@Since(float v)
结合GsonBuilder().serVersion(n)使用。当n>=v时,才会解析。

注:也是加在JavaBean属性上使用的。

版本控制注解@Util(float v)
与@Since相反,这次是n<v时才能够解析。

使用TypeAdapter来实现序列化与反序列化

eg:

public class FiveTest {
    @Test
    public void index() {
        Gson gson = new GsonBuilder().create();
        TypeAdapter<PersonJson> typeAdapter = gson.getAdapter(PersonJson.class);
        String json = "{\"name\":\"栗霖\",\"age\":\"18\",\"hobby\":\"我很是很喜欢FromSoftWare的。大爱宫崎英高,赞美太阳\"}";
        PersonJson p = new PersonJson("栗霖",18,"混系列忠实粉丝");

        System.out.println("---->序列化:是将对象转化为字符串 : " + typeAdapter.toJson(p));
        try {
            System.out.println("---->反序列化:是将字符串转化为对象 : "+ typeAdapter.fromJson(json));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注:序列化是将对象转化为字符串,反序列化是将字符串转化为对象。

Gson的容错机制
为什么容错:

如果Bean中定义的是int,但是返回的json对应的是一个""空字串怎么办?这就依赖到了Gson的容错机制。

1)创建宽松Gson

遇到问题,停止解析,以防止报错,功能相对较弱。

G

son gson = new GsonBuilder()
                        .setLenient()//宽松
                        .create();

2)自定义TypeAdapter

该方法更倾向于整体防止出现异常。

3)使用注解jsonAdapter,其实质也是自定义Adapter,该方法更倾向于某一个属性的保护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值