Android平台Retrofit框架下如何调整JSON序列化的键值顺序
解决方案
问题根本原因
Gson 默认开启了JSON字段按字母升序序列化的规则,所以生成的JSON顺序和你DataModel类中定义的字段顺序不一致。
方法1:使用@SerializedName注解指定排序(最简便,适配所有Gson 2.4+版本)
@SerializedName的order属性用于控制字段序列化的优先级,数值越小,字段在JSON中出现的位置越靠前,所有字段默认order值为0。
你只需要修改DataModel类的parameterid字段,给它设置比0小的order值即可让它排在第一位:
public class DataModel { private String slotno; // 设置order为-1,比其他字段默认的0更小,会排在首位 @SerializedName(value = "parameterid", order = -1) private String parameterid; private String batteryid; private String voltage; private String current; private String power; private String alarm; private String fault; // 原有构造方法、getter、setter保持不变 }
如果你需要所有字段都严格按照你定义的顺序排列,只需要给每个字段按顺序设置递增的order值即可:
public class DataModel { @SerializedName(value = "slotno", order = 1) private String slotno; @SerializedName(value = "parameterid", order = 0) // 最小的值排第一 private String parameterid; @SerializedName(value = "batteryid", order = 2) private String batteryid; @SerializedName(value = "voltage", order = 3) private String voltage; @SerializedName(value = "current", order = 4) private String current; @SerializedName(value = "power", order = 5) private String power; @SerializedName(value = "alarm", order = 6) private String alarm; @SerializedName(value = "fault", order = 7) private String fault; // 原有构造方法、getter、setter保持不变 }
方法2:自定义Gson实例关闭默认排序规则
如果你不想修改实体类的注解,且项目使用Gson 2.8.6及以上版本,可以自定义Gson实例,关闭默认的字母排序规则,然后将自定义的Gson实例传入GsonConverterFactory即可:
// 自定义Gson实例 Gson gson = new GsonBuilder() .setFieldOrderingStrategy((field1, field2) -> { // 优先把parameterid放在第一位 if (field1.getName().equals("parameterid")) return -1; if (field2.getName().equals("parameterid")) return 1; // 其余字段按类中声明的顺序排列 return 0; }) .create(); // 传入自定义的gson实例创建Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://103.87.174.181/BatteryStation/api/BatteryStationAPI/") .addConverterFactory(GsonConverterFactory.create(gson)) .build();
如果你的项目Gson版本低于2.8.6,推荐优先使用方法1,兼容性更强。
注意:JSON官方规范本身不要求字段的顺序,只有极少数兼容性差的老旧服务端会强制校验字段顺序,非必要场景不建议自定义序列化顺序。
内容的提问来源于stack exchange,提问作者Niranjan Adhav
相关产品推荐
相关产品推荐

