You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

属性名含点号时的Get/Set方法及Gson解析JSON方案问询

嘿,这两个问题在日常Java JSON处理中确实挺常见的,我来给你详细拆解下解决方案:

1. 属性名称包含点号时的Get/Set方法编写方式

首先得明确:Java本身不允许属性名包含点号(.是标识符的非法字符),所以你不会真的去定义一个叫payment_details.type的属性。实际场景中,我们都是通过注解映射来关联JSON里带点号的键和Java类的合法属性,对应的Get/Set方法依然遵循JavaBean规范:

  • 给Java属性起一个符合命名规范的名字(比如paymentDetailsType),用@SerializedName注解指定它对应的JSON键名(比如"payment_details.type")
  • Get/Set方法基于Java属性名生成,首字母大写,加上get/set前缀。

举个例子:

public class PaymentDTO {
    @SerializedName("payment_details.type")
    private String paymentDetailsType;

    // 标准的Get方法
    public String getPaymentDetailsType() {
        return paymentDetailsType;
    }

    // 标准的Set方法
    public void setPaymentDetailsType(String paymentDetailsType) {
        this.paymentDetailsType = paymentDetailsType;
    }
}

如果用Lombok的@Getter/@Setter注解,只需要给属性加上@SerializedName,Lombok会自动生成规范的Get/Set方法,不用手动编写。

2. Gson解析含点号的JSON属性无法获取"msg"值的解决办法

这个问题分两种常见场景,对应不同的解决方案:

场景一:JSON键本身带点号(比如"payment_details.type": "success")

这种情况直接用@SerializedName映射即可,和上面的例子类似。如果你的JSON里同时有msg字段,只要实体类里定义对应的属性就能正常获取:

public class ResponseDTO {
    @SerializedName("payment_details.type")
    private String paymentType;
    private String msg; // 直接对应JSON里的"msg"字段

    // Get/Set方法
    public String getPaymentType() { return paymentType; }
    public void setPaymentType(String paymentType) { this.paymentType = paymentType; }
    public String getMsg() { return msg; }
    public void setMsg(String msg) { this.msg = msg; }
}

// 解析代码
String jsonStr = "{\"payment_details.type\":\"credit_card\",\"msg\":\"操作成功\"}";
ResponseDTO dto = new Gson().fromJson(jsonStr, ResponseDTO.class);
System.out.println(dto.getMsg()); // 输出"操作成功"

场景二:JSON是嵌套结构(比如payment_details是对象,里面包含type和msg)

如果你的JSON结构是这样的:

{
  "payment_details": {
    "type": "credit_card",
    "msg": "操作成功"
  }
}

那你需要定义嵌套类来对应这个结构,而不是把payment_details.type当成一个整体键:

public class ResponseDTO {
    private PaymentDetails payment_details;

    // Get/Set方法
    public PaymentDetails getPayment_details() { return payment_details; }
    public void setPayment_details(PaymentDetails payment_details) { this.payment_details = payment_details; }

    // 嵌套内部类对应payment_details对象
    static class PaymentDetails {
        private String type;
        private String msg;

        // Get/Set方法
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        public String getMsg() { return msg; }
        public void setMsg(String msg) { this.msg = msg; }
    }
}

// 解析代码
String jsonStr = "{\"payment_details\":{\"type\":\"credit_card\",\"msg\":\"操作成功\"}}";
ResponseDTO dto = new Gson().fromJson(jsonStr, ResponseDTO.class);
System.out.println(dto.getPayment_details().getMsg()); // 输出"操作成功"

场景三:不想定义实体类,直接解析

如果只是临时获取值,不想创建实体类,可以用JsonObject直接分层解析:

String jsonStr = "{\"payment_details\":{\"type\":\"credit_card\",\"msg\":\"操作成功\"}}";
JsonObject rootObj = new Gson().fromJson(jsonStr, JsonObject.class);
// 先拿到payment_details对象,再获取msg值
String msg = rootObj.getAsJsonObject("payment_details").get("msg").getAsString();
System.out.println(msg); // 输出"操作成功"

内容的提问来源于stack exchange,提问作者Paresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:17:50