Gson解析:将Json字段映射到不同名的Java字段上以及将多个Json字段映射到单个Java字段

一、Gson正常解析

一般情况下我们使用Gson将Json字符串解析成Java实体数据类时,Json字段和Java字段是一一对应且名称完全一致。比如如下Json字符串:

{
    "userId":3,
    "userName":"张三"
}

对应的Java实体类为:

    //只能解析 userId、userName
    public final class UserInfo {
        public int userId;
        public String userName;
    }

此处多说一句,GsonFormat插件在Android Studio 升级到4.1.X后不可用了,可以使用GsonFormatPlus插件代替。

二、将Json字段映射到不同名的Java字段上

如上的Java实体类,如果此时后台返回的Json字符串字段发生变化:

{
    "USER_ID":4,
    "USER_NAME":"李四"
}

对应的前台也要修改Java实体类字段,随之而来的就是要修改View层的数据绑定了[大哭],为了避免一大推的修改,其实可以采用将Json字段映射到不同名的Java字段上,给实体类的字段加上@SerializedName 注解:

    //只能解析 USER_ID、USER_NAME
    public final class UserInfo {
        @SerializedName("USER_ID")
        public int userId;
        @SerializedName("USER_NAME")
        public String userName;
    }

但是注意,此时该实体类只能解析 USER_ID、USER_NAME 字段,不能再解析 userId、userName 字段了。

三、将多个Json字段映射到单个Java字段

如上所述,如果我们在不改变实体类字段的情况下,既想解析 USER_ID、USER_NAME 字段,还需解析 userId、userName 字段。此时则需修改实体类的字段注解,在 @SerializedName 注解中使用值和备用参数:

    //可以解析 userId、userName;USER_ID、USER_NAME
    public final class UserInfo {
        @SerializedName(value = "userId", alternate = "USER_ID")
        public int userId;
        @SerializedName(value = "userName", alternate = "USER_NAME")
        public String userName;
    }

此时的实例类就既可解析 USER_ID、USER_NAME 字段,也可解析 userId、userName 字段了。

 更近一步:

 再来如下的Json字符串:

{
    "ID":5,
    "NAME":"王五"
}

如果还想采用原实体类进行解析,则需将 @SerializedName 注解中的备用参数修改为字符串数组,如下:

    //可以解析 userId、userName;USER_ID、USER_NAME;ID、NAME
    public final class UserInfo {
        @SerializedName(value = "userId", alternate = {"USER_ID", "ID"})
        public int userId;
        @SerializedName(value = "userName", alternate = {"USER_NAME", "NAME"})
        public String userName;
    }

此时的实例类就可以解析 userId、userName;USER_ID、USER_NAME;ID、NAME了。

四、总结:

使用如下带有 @SerializedName 注解,注解中使用了值和备用参数,且备用参数为字符串数组 的实体类:

    //可以解析 userId、userName;USER_ID、USER_NAME;ID、NAME
    public final class UserInfo {
        @SerializedName(value = "userId", alternate = {"USER_ID", "ID"})
        public int userId;
        @SerializedName(value = "userName", alternate = {"USER_NAME", "NAME"})
        public String userName;
    }

可以同时解析如下三种字段的Json:

    String json1 = "{\"userId\":3,\"userName\":\"张三\"}";
    String json2 = "{\"USER_ID\":4,\"USER_NAME\":\"李四\"}";
    String json3 = "{\"ID\":5,\"NAME\":\"王五\"}";

格式化Json如下:

{
    "userId":3,
    "userName":"张三"
}

{
    "USER_ID":4,
    "USER_NAME":"李四"
}

{
    "ID":5,
    "NAME":"王五"
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值