关于JSON存放List集合的顺序问题

近期使用这个json生成sign签名,因为顺序问题导致一直验证不成功,说下解决方法。

使用的为alibaba的fastjson,版本为1.1.29

类定义

public class DetailBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private List<detail> detail;

	private int years;

	public class detail {
		private String name;
		private String serviceKey;
		private BigDecimal price = new BigDecimal("0");

		public String getName() {
			return name;
		}

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

		public String getServiceKey() {
			return serviceKey;
		}

		public void setServiceKey(String serviceKey) {
			this.serviceKey = serviceKey;
		}

		public BigDecimal getPrice() {
			return price;
		}

		public void setPrice(BigDecimal price) {
			this.price = price;
		}
	}

	public List<detail> getDetail() {
		return detail;
	}

	public void setDetail(List<detail> detail) {
		this.detail = detail;
	}

	public int getYears() {
		return years;
	}

	public void setYears(int years) {
		this.years = years;
	}

	@Override
	public String toString() {
		return "DetailBean [detail=" + detail + ", years=" + years + "]";
	}

}

然后存放进JSON里面

		JSONObject contentMap = new JSONObject();
		contentMap.put("detail", detail.getDetail());
		contentMap.put("years", detail.getYears());

DetailBean实体类的属性为

{
  "detail":[{
		"name": "abc",
		"serviceKey": "servicepackage_base",
		"price": 2400
	}, {
		"name": "def",
		"serviceKey": "addedvalue_repurchase",
		"price": 600
	}],
	"years": 2
}

然后输出JSON为

{"detail":[{"name":"abc","price":2400,"serviceKey":"servicepackage_base"},{"name":"def","price":600,"serviceKey":"addedvalue_repurchase"}],"years":2}

但是我想要的是按照输入的顺序显示

{"detail":[{"name":"abc","serviceKey":"servicepackage_base","price":2400},{"name":"def","serviceKey":"addedvalue_repurchase","price":600}],"years":2}

JSONObject的排序为字母排序,就是按照abcd…排序,按照固定排序的话,有三种方法:

第一种更改版本,升级为1.1.42以上的版本,这个版本支持使用JSONField,改变指定顺序

public class detail {
		@JSONField(ordinal = 1)
		private String name;
		@JSONField(ordinal = 2)
		private String serviceKey;
		@JSONField(ordinal = 3)
		private BigDecimal price = new BigDecimal("0");

		public String getName() {
			return name;
		}

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

		public void setServiceKey(String serviceKey) {
			this.serviceKey = serviceKey;
		}

		public BigDecimal getPrice() {
			return price;
		}

		public void setPrice(BigDecimal price) {
			this.price = price;
		}
}

第二种: 使用低版本的情况下,使用JSONType也可以达到要求

@JSONType(orders = { "name", "serviceKey", "price" })
	public class detail {
		private String name;
		private String serviceKey;
		private BigDecimal price = new BigDecimal("0");

		public String getName() {
			return name;
		}

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

		public String getServiceKey() {
			return serviceKey;
		}

		public void setServiceKey(String serviceKey) {
			this.serviceKey = serviceKey;
		}

		public BigDecimal getPrice() {
			return price;
		}

		public void setPrice(BigDecimal price) {
			this.price = price;
		}
	}

第三种更改属性名字,使用低版本,但同时,使用这种方法,就只能使用更改的名字获取值。

public class detail {
		@JSONField(name="a")
		private String name;
		@JSONField(name="b")
		private String serviceKey;
		@JSONField(name="c")
		private BigDecimal price = new BigDecimal("0");

		public String getName() {
			return name;
		}

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

		public String getServiceKey() {
			return serviceKey;
		}

		public void setServiceKey(String serviceKey) {
			this.serviceKey = serviceKey;
		}

		public BigDecimal getPrice() {
			return price;
		}

		public void setPrice(BigDecimal price) {
			this.price = price;
		}
	}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值