【问题标题】:JSON getting automatically sorted based on keys for the output of the REST APIJSON 根据 REST API 输出的键自动排序
【发布时间】: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 将通过JsonPropertyOrder annotation 支持这一点,例如@JsonPropertyOrder(alphabetic=true).
  • Alphabetic 的默认值为 false,因此它不应该在这里起作用。此外,如果这种行为是代码的行为,为什么 postman 和 swagger 的输出不同?
  • 当然,默认值为 false,但这是可以从生产者端控制/影响的方式。任何像 swagger ui 或邮递员这样的消费者都可以自己重新排序(例如,就像 Stefan 回答的那样)。毕竟 JSON 没有强加任何属性排序,所以你不能依赖它。

标签: java json spring-boot rest linkedhashmap


【解决方案1】:

可能只是 Swagger 的一个功能。见https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/

为了可读性,参数按类别分组并排序 按字母顺序。

【讨论】:

  • 可能的。我认为一些在线 JSON 查看器也实现了类似的行为。但问题是我的 API 支持排序行为,在这种情况下顺序很重要并且需要保留,因此这是不可取的。
  • 请看一下这个问题的最高答案:stackoverflow.com/questions/3948206/json-order-mixed-up(然后去一个 JSON 数组)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2015-12-06
  • 2016-10-12
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多