簡體   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