属性名含点号时的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
相关产品推荐
相关产品推荐

