Google Gson 属性重命名(@SerializedName 注解)

本文介绍如何使用Gson的@SerializedName注解解决JSON字符串键名与POJO属性名不匹配的问题,并演示了当面对多个不同键名对应同一属性的情况时,如何通过指定备选键名来实现灵活的数据解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认情况下解析和生成 JSON 字符串要求键名称和 POJO 类的属性名一一对应,实际应用中常常出现不一致现象,

如期望字符串:{“account”:”admin”,”password”:”123456”,”age”:30}

实际字符串:{“account”:”admin”,”code”:”123456”,”age”:30}

Gson 使用 @SerializedName 注解解决 JSON 字符串键名称和 POJO 类属性名不对应的问题

示例

1 POJO 类

import com.google.gson.annotations.SerializedName;

public class User {

    private String account;

    @SerializedName("code")
    private String password;

    private String name;

    private int age;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [account=" + account + ", password=" + password + ", name=" + name + ", age=" + age + "]";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

2 单元测试

@Test
public void test() {
    Gson gson = new Gson();

    String userStr = "{\"account\":\"admin\",\"code\":\"123456\",\"age\":30}";

    User user = gson.fromJson(userStr, User.class);

    assertEquals(user.getAccount(), "admin");
    assertEquals(user.getPassword(), "123456");
    assertEquals(user.getAge(), 30);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果存在多个需要解析的 JSON 字符串,每个字符串的键名称各不相同,但实际上对应的都是 POJO 对象的同一个属性,如

{“account”:”admin”,”password”:”123456”,”age”:30}

{“account”:”admin1”,”code”:”000000”,”age”:20}

{“account”:”adminX”,”xxx”:”aaaaaa”,”age”:40}

{“account”:”adminY”,”yyy”:”bbbbbb”,”age”:45}

{“account”:”adminZ”,”zzz”:”cccccc”,”age”:50}

解决方法:

1 修改 POJO 类

import com.google.gson.annotations.SerializedName;

public class User {

    private String account;

    @SerializedName(value = "password", alternate = {"code", "xxx", "yyy", "zzz"})
    private String password;

    private String name;

    private int age;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [account=" + account + ", password=" + password + ", name=" + name + ", age=" + age + "]";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

2 单元测试

@Test
public void test() {
    Gson gson = new Gson();

    String userStr = "{\"account\":\"admin\",\"password\":\"123456\",\"age\":30}";
    User user = gson.fromJson(userStr, User.class);
    assertEquals(user.getAccount(), "admin");
    assertEquals(user.getPassword(), "123456");
    assertEquals(user.getAge(), 30);

    userStr = "{\"account\":\"admin1\",\"code\":\"000000\",\"age\":20}";
    user = gson.fromJson(userStr, User.class);
    assertEquals(user.getAccount(), "admin1");
    assertEquals(user.getPassword(), "000000");
    assertEquals(user.getAge(), 20);

    userStr = "{\"account\":\"adminX\",\"xxx\":\"aaaaaa\",\"age\":40}";
    user = gson.fromJson(userStr, User.class);
    assertEquals(user.getAccount(), "adminX");
    assertEquals(user.getPassword(), "aaaaaa");
    assertEquals(user.getAge(), 40);

    userStr = "{\"account\":\"adminY\",\"yyy\":\"bbbbbb\",\"age\":45}";
    user = gson.fromJson(userStr, User.class);
    assertEquals(user.getAccount(), "adminY");
    assertEquals(user.getPassword(), "bbbbbb");
    assertEquals(user.getAge(), 45);

    userStr = "{\"account\":\"adminZ\",\"zzz\":\"cccccc\",\"age\":50}";
    user = gson.fromJson(userStr, User.class);
    assertEquals(user.getAccount(), "adminZ");
    assertEquals(user.getPassword(), "cccccc");
    assertEquals(user.getAge(), 50);
}
SLAM地图构建与定位算法,含有卡尔曼滤波和粒子滤波器的程序 SLAM算法的技术文档合集(含37篇文档) slam算法的MATLAB源代码,国外的代码 基于角点检测的单目视觉SLAM程序,开发平台VS2003 本程序包设计了一个利用Visual C++编写的基于EKF的SLAM仿真器 Slam Algorithm with data association Joan Solà编写6自由度扩展卡尔曼滤波slam算法工具包 实时定位与建图(SLAM),用激光传感器采集周围环境信息 概率机器人基于卡尔曼滤波器实现实时定位和地图创建(SLAM算法 机器人地图创建新算法,DP-SLAM源程序 利用Matlab编写的基于EKF的SLAM仿真器源码 机器人定位中的EKF-SLAM算法,实现同时定位和地图构建 基于直线特征的slam机器人定位算法实现和优化 SLAM工具箱,很多有价值的SLAM算法 EKF-SLAM算法对运动机器人和周围环境进行同步定位和环境识别仿真 SLAM using Monocular Vision RT-SLAM机器人摄像头定位,运用多种图像处理的算法 slam(simultaneous localization and mapping)仿真很好的入门 SLAM自定位导航的一个小程序,适合初学者以及入门者使用 slam算法仿真 slam仿真工具箱:含slam的matlab仿真源程序以及slam学习程序 移动机器人栅格地图创建,SLAM方法,可以采用多种地图进行创建 SLAM算法程序,来自悉尼大学的作品,主要功能是实现SLAM算法SLAM算法中的EKF-SLAM算法进行改进,并实现仿真程序 SLAM的讲解资料,机器人导航热门方法
### SLAM算法原理 SLAM(Simultaneous Localization and Mapping),即同步定位与建图,是一种让移动机器人在未知环境中运动时能够构建环境地图的同时计算自身位置的技术。其核心目标是在传感器数据的基础上解决两个主要问题:一是机器人的自我定位;二是周围环境的地图构建。 SLAM通常分为三个主要模块:前端、后端和回环检测。前端负责处理原始传感器数据并估计相机或激光雷达的姿态变化,常见的方法包括基于几何的特征点匹配和直接法[^1]。后端则通过优化技术来最小化累积误差,从而提高轨迹估计精度。回环检测用于识别机器人曾经访问过的区域,消除累计漂移效应。 #### 原理概述 - **状态估计**:SLAM的核心在于建立一个数学模型来描述系统的动态特性及其观测关系。该过程可以被看作是一个贝叶斯滤波器的应用实例,在此过程中,系统试图最大化给定所有测量值下的最可能的状态序列。 - **概率推断**:由于存在噪声干扰,SLAM采用概率论作为基础工具之一,利用卡尔曼滤波(Kalman Filter) 或粒子滤波(Particle Filter) 来完成实时的概率推理任务。 - **非线性优化**:对于某些复杂的SLAM变种来说,比如视觉惯导融合VIO(Visual-Inertial Odometry),往往需要用到更高级别的数值求解技巧——例如稀疏束调整(Sparse Bundle Adjustment)[^2]。 --- ### 实现方式 为了更好地理解如何具体实现SLAM算法,下面给出了一段简单的Python伪代码演示基本流程: ```python import numpy as np class SimpleSLAM: def __init__(self): self.map_points = [] # 地图上的关键点集合 self.robot_pose = None # 当前姿态初始化为空 def process_measurement(self, measurement): """ 处理单次测量 """ new_keypoints = extract_features(measurement.image_data) if not self.map_points: # 如果还没有任何已知地标,则将当前帧的关键点加入到全局坐标系中 add_to_map(new_keypoints) matched_pairs = match_with_existing(new_keypoints, self.map_points) updated_pose = estimate_robot_position(matched_pairs) refined_result = optimize_graph(updated_pose, all_observations_so_far()) update_internal_state(refined_result) ``` 以上只是一个非常简化版的例子,实际工程中的SLAM系统远比这段代码要复杂得多,它需要考虑诸如鲁棒性、效率等因素,并且针对不同类型的硬件平台做出相应适配[^3]。 --- ### 动态SLAM的发展趋势 随着研究进展和技术积累,越来越多的研究者开始关注动态环境下运行效果更好的新型SLAM方案设计。这些新方向不仅限于静态结构重建方面的工作,还包括对可变形物体跟踪的支持能力提升等方面的内容。例如DS-SLAM、Dyna-SLAM等就是专门为应对含有大量活动成分的真实世界场景所开发出来的代表性成果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值