【发布时间】:2021-08-15 14:23:07
【问题描述】:
我有一个用 java springboot 编写的简单 rest API,它产生 JSON 输出,如下例所示:
{
"status": 0,
"data": {
"total": 351,
"offset": 0,
"limit": 10,
"info": {
"1010": {
"id": 1010,
"name": "John",
"age": 28
},
"1009": {
"id": 1009,
"name": "Philippe",
"age": 42
},
"1008": {
"id": 1008,
"name": "Nick",
"age": 22
},
"1007": {
"id": 1007,
"name": "Razor",
"age": 19
},
"1006": {
"id": 1006,
"name": "Marco",
"age": 67
},
"1005": {
"id": 1005,
"name": "Pablo",
"age": 19
},
"1004": {
"id": 1004,
"name": "Sheldon",
"age": 29
},
"1003": {
"id": 1003,
"name": "Hazel",
"age": 34
},
"1002": {
"id": 1002,
"name": "Penny",
"age": 44
},
"1001": {
"id": 1001,
"name": "Chris",
"age": 41
}
}
},
"timeStamp": "2021-05-26T15:13:41.022+0000 UTC"
}
当我使用 swagger 测试 API 时,JSON 会按照以下方式根据键自动排序:
{
"status": 0,
"data": {
"total": 351,
"offset": 0,
"limit": 10,
"info": {
"1001": {
"id": 1001,
"name": "Chris",
"age": 41
},
"1002": {
"id": 1002,
"name": "Penny",
"age": 44
},
"1003": {
"id": 1003,
"name": "Hazel",
"age": 34
},
"1004": {
"id": 1004,
"name": "Sheldon",
"age": 29
},
"1005": {
"id": 1005,
"name": "Pablo",
"age": 19
},
"1006": {
"id": 1006,
"name": "Marco",
"age": 67
},
"1007": {
"id": 1007,
"name": "Razor",
"age": 19
},
"1008": {
"id": 1008,
"name": "Nick",
"age": 22
},
"1009": {
"id": 1009,
"name": "Philippe",
"age": 42
},
"1010": {
"id": 1010,
"name": "John",
"age": 28
}
}
},
"timeStamp": "2021-05-26T15:13:41.022+0000 UTC"
}
此外,当我使用在线 JSON 查看器来可视化 JSON 输出时,行为保持不变。但是,当我使用 Postman 访问 API 时,订单被保留。有人能解释一下这种行为以及如何控制这种行为吗?
【问题讨论】:
-
这似乎是属性名称的简单词汇排序。 Jackson 将通过
JsonPropertyOrderannotation 支持这一点,例如@JsonPropertyOrder(alphabetic=true). -
Alphabetic 的默认值为 false,因此它不应该在这里起作用。此外,如果这种行为是代码的行为,为什么 postman 和 swagger 的输出不同?
-
当然,默认值为 false,但这是可以从生产者端控制/影响的方式。任何像 swagger ui 或邮递员这样的消费者都可以自己重新排序(例如,就像 Stefan 回答的那样)。毕竟 JSON 没有强加任何属性排序,所以你不能依赖它。
标签: java json spring-boot rest linkedhashmap