【问题标题】:How to format JSON list response in Spring Boot如何在 Spring Boot 中格式化 JSON 列表响应
【发布时间】:2021-10-22 11:45:11
【问题描述】:

我正在为我真正喜欢的游戏创建一个 API 作为个人项目。我试图弄清楚如何用每个成员的特定值封装 JSON 列表的每个成员。

例如,我的回复是这样的:

[
    [
        {
            "createdAt": "2021-08-21T05:04:45.000+00:00",
            "updatedAt": "2021-08-21T05:04:45.000+00:00",
            "id": 1,
            "cardName": "Demon Fiend",
            ...
        },
        {
            "createdAt": "2021-08-21T05:04:58.000+00:00",
            "updatedAt": "2021-08-21T05:04:58.000+00:00",
            "id": 2,
            "cardName": "Stack",
            ...
        },
        {
            "createdAt": "2021-08-21T05:05:00.000+00:00",
            "updatedAt": "2021-08-21T05:05:00.000+00:00",
            "id": 3,
            "cardName": "Overflow",
            ...
        }
    ]
]

而且,理想的响应是通过他们的 cardName 或 id 来索引它们,如下所示:

[
    [
        "Demon Fiend" : {
            "createdAt": "2021-08-21T05:04:45.000+00:00",
            "updatedAt": "2021-08-21T05:04:45.000+00:00",
            "id": 1,
            "cardName": "Demon Fiend",
            ...
        },
        "Stack" : {
            "createdAt": "2021-08-21T05:04:58.000+00:00",
            "updatedAt": "2021-08-21T05:04:58.000+00:00",
            "id": 2,
            "cardName": "Stack",
            ...
        },
        "Overflow" : {
            "createdAt": "2021-08-21T05:05:00.000+00:00",
            "updatedAt": "2021-08-21T05:05:00.000+00:00",
            "id": 3,
            "cardName": "Overflow",
            ...
        }
    ]
]

我认为这将使用户更容易遍历数据。再说一次,“恶魔”可能只是1 : { ... }

【问题讨论】:

  • 如果你想在 MySQL 中进行转换,你可以使用 JSON_OBJECTAGGJSON_OBJECT
  • 你可以创建Map<Integer, UserData> memberIdMap的地图

标签: java json spring-boot rest


【解决方案1】:

您收到的 JSON 响应无效 - 我建议使用 - [JSON Formatter] 验证 JSON

这是您的解决方案的代码,将 siteInfo[i].cardName 更改为您想要使用的任何值,例如cardName, id...(我在下面的代码中使用了 cardName)。

享受吧! :)

var siteInfo =
  [
    {
      "createdAt": "2021-08-21T05:04:45.000+00:00",
      "updatedAt": "2021-08-21T05:04:45.000+00:00",
      "id": 1,
      "cardName": "Demon Fiend"
    },
    {
      "createdAt": "2021-08-21T05:04:58.000+00:00",
      "updatedAt": "2021-08-21T05:04:58.000+00:00",
      "id": 2,
      "cardName": "Stack"
    },
    {
      "createdAt": "2021-08-21T05:05:00.000+00:00",
      "updatedAt": "2021-08-21T05:05:00.000+00:00",
      "id": 3,
      "cardName": "Overflow"
    }
  ]

var map = new Map();
for(var i=0; i<siteInfo.length; i++) {
  map.set(siteInfo[i].cardName, siteInfo[i]);
}
let jsonObject = {}; 
  map.forEach((value, key) => {  
    jsonObject[key] = value  
  });  
  console.log(JSON.stringify(jsonObject)); 

【讨论】:

    【解决方案2】:

    我必须承认你的问题让我有点困惑。

    我假设您在控制器中返回一个对象列表作为响应。 像这样,

    public List<YourDtoClass> ...
    

    如果是这种情况,您可以改为返回 Map。 像这样,

    public Map<String, YourDtoClass>
    

    如果你已经创建了一个List,你可以如下创建Map,

    return yourList.stream().collect(Collectors.toMap(YourDtoClass::getCardName, Function.identity()));
    

    【讨论】:

      【解决方案3】:

      让这是你的名为 SampleClass 的类

      类 SampleClass { "createdAt": "2021-08-21T05:04:45.000+00:00", "updatedAt": "2021-08-21T05:04:45.000+00:00", “身份证”:1, "cardName": "恶魔恶魔", ... }

      不使用对象数组,而是使用键为“cardName”、值为 SampleClass 的映射。然后你会得到想要的表格。

      【讨论】:

      • 那你怎么做这个json?问题中没有明确提及。请缩小您的问题范围。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2021-02-20
      • 2015-05-20
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多