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

Java-如何处理动态JSON类别名称?,java,json,parsing,dynamic,Java,Json,Parsing,Dynamic,我正在尝试学习JSON解析,一个关于如何解析JSON的快速问题出现了,其中“类别”名称可以根据外部API(特别是我正在玩的视频游戏API)的请求进行更改 作为一个随机示例,发送带有“laofuthetiger”作为URI的API请求将返回如下所示的JSON: { "laofuthetiger": { "id": 51044840, "name": "Lao Fu the Tiger", "profileIconId": 664, "revisionDate": 14845

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

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

{ "laofuthetiger": {
   "id": 51044840,
   "name": "Lao Fu the Tiger",
   "profileIconId": 664,
   "revisionDate": 1484537981000,
   "summonerLevel": 30
}}
public class Player{
   private SummonerDto laofuthetiger;
...
    mPlayer = "laofuthetiger";

    Repository mRepo = new Repo();
    mRepo.requestPlayerByName(player)

[when you get your response]

 private void getMyResponseFromAPI(Json jsonResponse){
     JsonObject jSummoner jsonResponse.get(mPlayer).getAsJsonObject()
     SummonerDto summoner = new Gson().fromJson(jPlayer, Summoner.class)

     Player player = new Player(summoner)
 }
将URI更改为“sloverlord”会产生以下结果:

{ "sloverlord": {
   "id": 39943538,
   "name": "sloverlord",
   "profileIconId": 712,
   "revisionDate": 1484537981000,
   "summonerLevel": 30
}}
根据我对使用GSON进行JSON解析的初步理解,我能够通过一个如下所示的类从第一个JSON示例中收集数据:

{ "laofuthetiger": {
   "id": 51044840,
   "name": "Lao Fu the Tiger",
   "profileIconId": 664,
   "revisionDate": 1484537981000,
   "summonerLevel": 30
}}
public class Player{
   private SummonerDto laofuthetiger;
...
    mPlayer = "laofuthetiger";

    Repository mRepo = new Repo();
    mRepo.requestPlayerByName(player)

[when you get your response]

 private void getMyResponseFromAPI(Json jsonResponse){
     JsonObject jSummoner jsonResponse.get(mPlayer).getAsJsonObject()
     SummonerDto summoner = new Gson().fromJson(jPlayer, Summoner.class)

     Player player = new Player(summoner)
 }
其中,callerdto包含单个元素id、name等。但是,我不知道如何处理API调用之间的实际“类别”(或其调用方式)更改。在这个解决方案中,使用laofuthetiger的调用可以正常工作,但是sloverlord会返回一个内部错误,原因很明显

编辑:有关更多信息,URI如下所示:
dev.host.com/get\u player\u by\u name/laofuthetiger?api\u key=XXXXX
其中“laofuthetiger”可以是任何玩家名称。

使用 更新

添加了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 + "]";
        }

    }
import java.io.IOException;
导入java.util.Map;
导入com.google.gson.gson;
导入com.google.gson.JsonElement;
导入com.google.gson.JsonObject;
导入com.google.gson.JsonParser;
公开课考试{
私有静态最终字符串JSON=“{\“laofuthetiger\”:{“+”\“id\”:51044840,”
+“\”姓名:\”老虎老夫“,”+“\”档案编号\”:664“+“\”修订日期\”:1484537981000,”
+“\”召唤级别\“:30”+“}}”;
公共静态void main(字符串[]args)引发IOException{
JsonParser=新的JsonParser();
Map.Entry e=((JsonObject)parser.parse(JSON)).entrySet().iterator().next();
Gson g=新的Gson();
callerdto=g.fromJson(e.getValue(),callerdto.class);
系统输出打印项次(dto);
}
班级传唤员{
int-id;
字符串名;
intprofileiconid;
修订日期长;
int召唤级别;
@凌驾
公共字符串toString(){
返回“callerdto[id=“+id+”,name=“+name+”,profileIconId=“+profileIconId+”,修订日期=”
+修订日期+”,召唤级别=“+召唤级别+”];
}
}
输出

召唤师[id=51044840,name=Lao Fu the Tiger,profileIconId=664,修订日期=1484537981000,召唤师级别=30]
有一个选项:

你总是知道你球员的名字,对吗

当您可以使用API时,它是这样的:

{ "laofuthetiger": {
   "id": 51044840,
   "name": "Lao Fu the Tiger",
   "profileIconId": 664,
   "revisionDate": 1484537981000,
   "summonerLevel": 30
}}
public class Player{
   private SummonerDto laofuthetiger;
...
    mPlayer = "laofuthetiger";

    Repository mRepo = new Repo();
    mRepo.requestPlayerByName(player)

[when you get your response]

 private void getMyResponseFromAPI(Json jsonResponse){
     JsonObject jSummoner jsonResponse.get(mPlayer).getAsJsonObject()
     SummonerDto summoner = new Gson().fromJson(jPlayer, Summoner.class)

     Player player = new Player(summoner)
 }
这样,您将始终得到您的响应,与您的玩家(或召唤者)的姓名无关

它为什么有效?

API响应中唯一更改的部分是召唤器名称…响应的其余部分始终遵循相同的模式。因此,如果您获得具有正确名称的Json对象,您将始终具有以下内容:

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

这实际上是用Gson(或Jackson)解析.

您能更改API响应吗?如果更改API响应是指重新格式化,则不能;API完全是外部的,不在我的控制范围内:/如果您使用Jackson:Entry是独立类吗?我之所以问这个问题,是因为entrySet在这种用法中似乎没有定义。谢谢!这确实有帮助。@zeBugMan:很高兴为您提供帮助。如果您找到我的answ呃,很有用,请投票/接受它。