[英]How to create a multiple JSON objects inside an Array in java selenium
[英]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.