为何JsonNode.get("players").asText()返回空字符串?
问题分析与解决
问题根源
你的players节点是JSON数组,不是字符串类型,调用JsonNode.asText()会直接返回空字符串——这个方法只适合获取字符串类型的节点值,对数组、对象这类复合节点完全不适用。你不需要把节点转成字符串再二次解析,直接处理数组节点就能得到目标Map<String, Player>。
修正方案(两种写法)
写法一:通过流转换
byte[] playersFile = storageService.downloadFile(FILENAME); String dataJson = new String(playersFile); try { JsonNode jsonNode = objectMapper.readTree(dataJson); // 直接拿到players数组节点 JsonNode playersNode = jsonNode.get("players"); // 把数组解析成键值对列表,再转成Map List<Map.Entry<String, Player>> playerEntries = objectMapper.readValue( playersNode.traverse(), new TypeReference<List<Map.Entry<String, Player>>>() {} ); data = playerEntries.stream() .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } catch (JsonProcessingException e) { e.printStackTrace(); }
写法二:用Jackson的convertValue直接转换(更简洁)
byte[] playersFile = storageService.downloadFile(FILENAME); String dataJson = new String(playersFile); try { JsonNode jsonNode = objectMapper.readTree(dataJson); JsonNode playersNode = jsonNode.get("players"); // 直接将数组节点转换为目标Map data = objectMapper.convertValue( playersNode, new TypeReference<Map<String, Player>>() {} ); } catch (JsonProcessingException e) { e.printStackTrace(); }
注意事项
- 确保你的
Player类字段和JSON里value的字段名完全匹配,比如uuid、name、elo这些,或者给字段加上Jackson的@JsonProperty注解做映射。 - 如果怕
players节点不存在导致空指针,可以加个判断:if (playersNode != null && playersNode.isArray())再处理。
内容的提问来源于stack exchange,提问作者patplo1999
相关产品推荐
相关产品推荐

