gpt4 book ai didi

Java - 如何处理动态 JSON 类别名称?

转载 作者:行者123 更新时间:2023-12-01 09:00:52 24 4
gpt4 key购买 nike

我正在尝试学习 JSON 解析,并且出现了一个关于如何解析 JSON 的快速问题,其中“类别”名称可以根据外部 API(特别是我正在玩的视频游戏 API)的请求进行更改与)。

作为一个随机示例,发送使用“laofuthetiger”作为 URI 的 API 请求会返回如下所示的 JSON:

{ "laofuthetiger": {
"id": 51044840,
"name": "Lao Fu the Tiger",
"profileIconId": 664,
"revisionDate": 1484537981000,
"summonerLevel": 30
}}

将 URI 更改为“sloverlord”会产生以下结果:

{ "sloverlord": {
"id": 39943538,
"name": "sloverlord",
"profileIconId": 712,
"revisionDate": 1484537981000,
"summonerLevel": 30
}}

根据我对使用 GSON 解析 JSON 的基本了解,我可以通过使用如下所示的类来从第一个 JSON 示例中收集数据:

public class Player{
private SummonerDto laofuthetiger;
...

其中 SummonerDto 包含各个元素 id、名称等。但是,我不知道如何处理 API 调用之间实际的“类别”(或它的名称)变化。通过此解决方案,使用 laofuthetiger 的调用可以工作,但 sloverlord 会由于明显的原因返回内部错误。

编辑:有关更多信息,URI 如下所示:dev.host.com/get_player_by_name/laofuthetiger?api_key=XXXXX其中“laofthetiger”可以是任何玩家名称。

最佳答案

使用 GSON

import java.util.Map; 

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

JsonParser parser = new JsonParser();
//e.getKey() is actual 'category' name
//e.getValue() is raw JsonObject
Map.Entry<String, JsonElement> e = ((JsonObject)parser.parse(jsonString)).entrySet().iterator().next();
Gson g = new Gson();
SummonerDto dto = g.fromJson(e.getValue(), SummonerDto.class);

使用 Jackson

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper om = new ObjectMapper();
JsonNode tree = om.readTree(jsonString);
JsonNode dtoNode = tree.get(0);
SummonerDto dto = om.readValue(om.treeAsTokens(dtoNode), SummonerDto.class);

更新

添加了 GSON 的完整代码

import java.io.IOException;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class Test {

private static final String JSON = "{ \"laofuthetiger\": {" + "\"id\": 51044840,"
+ "\"name\": \"Lao Fu the Tiger\"," + "\"profileIconId\": 664," + "\"revisionDate\": 1484537981000, "
+ "\"summonerLevel\": 30" + "}}";

public static void main(String[] args) throws IOException {
JsonParser parser = new JsonParser();
Map.Entry<String, JsonElement> e = ((JsonObject) parser.parse(JSON)).entrySet().iterator().next();
Gson g = new Gson();
SummonerDto dto = g.fromJson(e.getValue(), SummonerDto.class);

System.out.println(dto);
}

class SummonerDto {
int id;
String name;
int profileIconId;
long revisionDate;
int summonerLevel;

@Override
public String toString() {
return "SummonerDto [id=" + id + ", name=" + name + ", profileIconId=" + profileIconId + ", revisionDate="
+ revisionDate + ", summonerLevel=" + summonerLevel + "]";
}

}

输出

SummonerDto [id=51044840,name=老虎老福,profileIconId=664,revisionDate=1484537981000,summonerLevel=30]

关于Java - 如何处理动态 JSON 类别名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41680906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com