项目:使用REST网络服务的Android应用程序
使用:
客户 - 排球
服务器API - 泽西岛
转换器:Gson
这是我第一次在这里提问,我将提供“回避”此代码约定的方法。由于我正在开发一个项目,其中POJO字段已被定义为大写(遗憾的是,我无法改变),我必须找到一种方法来修复JSON字符串并将其转换为大写POJO的实例。
基本上它是:客户POJO< - > json对象转换为/来自gson< - >服务器POJO
所以,假设我在Users.class
String USERNAME;
当Jersey发送via @Produces
的实例时,它遵循创建JSON并发送对象的约定
{"username": "random_name"}
当它从JSON通过gson.fromJSON
转换时,客户端POJO的实例将获得该字段的空值(显然因为JSONObject中的字段是小写的)。
这是我通过使用解析JSONObject并将每个键放在大写的方法来管理它的方法:
public static String fixJSONObject(JSONObject obj) {
String jsonString = obj.toString();
for(int i = 0; i<obj.names().length(); i++){
try{
obj.names().getString(i).toUpperCase());
jsonString=jsonString.replace(obj.names().getString(i),
obj.names().getString(i).toUpperCase());
} catch(JSONException e) {
e.printStackTrace();
}
}
return jsonString;
}
幸运的是,由于gson.fromJSON()
需要String(而不是JSONObject)作为Class之外的参数,我设法以这种方式解决问题。
所以,我的问题是:是否有任何优雅的方法使JSON忽略该代码约定并创建具有精确字段的JSON对象?在这种情况下:
{"USERNAME": "random_name"}
答案 0 :(得分:2)
Jersey在内部使用JAXB将bean编组为xml / json。因此,您始终可以使用@XmlElement
注释并使用name属性来设置用于编组的属性名称
@XmlElement(name="USERNAME")
String USERNAME;
答案 1 :(得分:1)
只需使用注释com.google.gson.annotations.SerializedName
在课程Users.java
中添加:
@SerializedName("username")
String USERNAME;