繁体   English   中英

如何创建一个包含多个对象的json数组 java spring boot

[英]How to create a json array with multiple objects java spring boot

我已经创建了具有最多评论和最高评分游戏的用户,但坚持如何为 average_likes_per_game 创建 json 数组。 我想做一些看起来像这样的东西:

{
    "user_with_most_comments": "Alison",
    "highest_rated_game": "Uncharted 4",
    "average_likes_per_game": [
    {
        "title": "Call of Duty, Infinite Warfare",
        "average_likes": 4,
    },
    {
        "title": "Uncharted 4",
        "average_likes": 7,
    }
  ] 
}

目前它看起来像:

{ "user_with_most_comments": "Alison", "highest_rated_game": "Uncharted 4", "average_likes_per_game": "[\"Uncharted 4 \",\"7\",\"Call of Duty, Infinite Warfare \",\"7\"]" }

我可以看到我错过了将平均喜欢数添加到与游戏相关的数字中。 即使使用 Gson setPrettyPrinting 东西,我似乎也无法正确格式化它。

我手头的 average_likes_per_game 数据是一个包含游戏名称的 map,平均喜欢反对它。 它只是将其转换为这个 json 数组。

这是使用 Spring Boot 完成的,我试图以漂亮的 json 格式一次返回所有内容

@RequestMapping(value = "/games/report", method = RequestMethod.GET)
    public String getReport() throws IOException {
        Map<String, String> report = new HashMap<>();

        String highestRankedGame = gameService.findHighestRatedGame();
        String userWithMostComments = gameService.findUserWithMostComments();
        Map<String,String> averageLikesPerGame = gameService.findAverageLikesPerGame();
        String likesToJsonArray = String.valueOf(gameService.convertLikesToJsonArray(averageLikesPerGame));

        report.put("highest_rated_game",highestRankedGame);
        report.put("user_with_most_comments", userWithMostComments);
        report.put("average_likes_per_game",likesToJsonArray);

        String jsonReport = gameService.convertReportToJson(report);
        String finalJsonReport = gameService.makeMePretty(jsonReport);

        return finalJsonReport;
    }

查找平均喜欢每场比赛返回 map 的 2 个字符串,这样它就不会导致问题被添加到最后的最终报告 map 中。 目前我的“convertLikesToJsonarray”非常糟糕,是我被困的地方

    public JSONArray convertLikesToJsonArray(Map<String, String> averageLikesPerGame) throws JSONException {
        JSONArray myArray = new JSONArray();

        for(Map.Entry<String,String> entry : averageLikesPerGame.entrySet()) {
            myArray.put(entry.getKey());
            myArray.put(entry.getValue());
        }
        return myArray;
    }

值得注意的是,我最后将最终报告转换为 json,这可能会使数组变得复杂,因为我认为它不适合那个

    @Override
    public String convertReportToJson(Map<String, String> report) {

        ObjectMapper mapper = new ObjectMapper();
        String jsonArray = null;
        try {
            jsonArray = mapper.writeValueAsString(report);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return jsonArray;
    }
String.valueOf(gameService.convertLikesToJsonArray(averageLikesPerGame)); 

您正在将其作为 json 中的单个值,而不是实际的 json。这就是为什么它在您的 JSON output 中全部转义的原因。您也没有展示您的漂亮打印方法,因此无法评论其中的 output。 尝试

    //Use object instead of String as you want nested objects in output
    Map<String, Object> report = new HashMap<>();

    String highestRankedGame = gameService.findHighestRatedGame();
    String userWithMostComments = gameService.findUserWithMostComments();
    Map<String,String> averageLikesPerGame = gameService.findAverageLikesPerGame();

    report.put("highest_rated_game",highestRankedGame);
    report.put("user_with_most_comments", userWithMostComments);
   //Add averageLikesPerGame directly to report without modifying
    report.put("average_likes_per_game",averageLikesPerGame.entrySet());

    String jsonReport = gameService.convertReportToJson(report);

    return jsonReport;

public String convertReportToJson(Map<String, Object> report) {

    ObjectMapper mapper = new ObjectMapper();
    String jsonArray = null;
    try {
        //Don't need Gson, can use writerWithDefaultPrettyPrinter with Jackson which 
        //You are already using
        jsonArray = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(report);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return jsonArray;
}

如果你想在带有标签的数组中映射值,那么你可以做这样的事情

    List<Map<String,String>> labelledAvgLikesPerGame =
            averageLikesPerGame.entrySet().stream()
                    .map( entry ->
                           //Needs java 9+ for ofEntries
                           //You'll need to make new HashMap,put + return
                           // for java 8
                            Map.ofEntries(
                                    Map.entry("title", entry.getKey()),
                                    Map.entry("average_likes", entry.getValue())
                            )).collect(Collectors.toList());

    report.put("highest_rated_game",highestRankedGame);
    report.put("user_with_most_comments", userWithMostComments);
    report.put("average_likes_per_game",labelledAvgLikesPerGame);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM