如何在JAVA中解析随机键名的JSON

3

当我不知道键名时,如何将一些 JSON 转换为 POJO?

这是我的 POJO:

public class Summoner {

    private Details summonerDetails;

    public Details getSummonerDetails() {
        return summonerDetails;
    }

    public void setSummonerDetails(Details summonerDetails) {
        this.summonerDetails = summonerDetails;
    }

}

Details类有变量如id、name等。-> 这里没有问题。

这是我在Main类中尝试将JSON映射到POJO的代码行:

Summoner test = new ObjectMapper().readValue(json, Summoner.class);

这是我收到的JSON响应示例:

{
   "randomName":{
      "id":22600348,
      "name":"Ateuzz",
      "profileIconId":546,
      "summonerLevel":30,
      "revisionDate":1378316614000
   }
}

如果我的POJO Details成员变量名为“randomName”,上面的代码将起作用。但是,当我得到一个与“randomName”不同的名称响应时,它就不起作用了。如何使我的代码适用于随机名称?
我正在使用Jackson。
很抱歉我无法更清楚地阐述我的问题。

你需要编写一个自定义映射器。默认的映射器怎么知道你想要这样做呢? - TJ-
其实我也不太清楚。这是我第一次使用API、JSON、JACKSON等技术。所有的东西都很新鲜。我会研究一下自定义映射器,谢谢! - facundop
2个回答

2
我有一个解决方案,不仅使用jackson API,还使用了org.json API
String str = "{\"randomName\":{\"id\":22600348,\"name\":\"Ateuzz\",\"profileIconId\":546,\"summonerLevel\":30,\"revisionDate\":1378316614000}}";
JSONObject json = new JSONObject(str);
Iterator<?> keys = json.keys();
while(keys.hasNext())
{
    String key = (String)keys.next();
    Details test = new ObjectMapper().readValue(json.getJSONObject(key).toString(), Details.class);

}  

我使用了另一个JAVA Json API将您的字符串转换为jsonObject,然后迭代它以获取您的第一个键值,并将其映射到您的Details类中。
我假设您的json格式与您在问题中提到的相同。
希望这可以帮助您。

0
使用Jackson:
    String json = "{\"randomName\":{\"id\":22600348,\"name\":\"Ateuzz\",\"profileIconId\":546,\"summonerLevel\":30,\"revisionDate\":1378316614000}}";
    try
    {
      @SuppressWarnings("unchecked")
      Map<String, Map<String, Object>> map = (Map) new ObjectMapper().readValue(json, Map.class);
      for(String key : map.keySet())
      {
          Map<String, Object> submap = map.get(key);
          System.out.println(key + ":");
          for(String k : submap.keySet())
          {
              System.out.println("\t" + k + ": " + submap.get(k));
          }
      }
    }
    catch(IOException e)
    {
        e.printStackTrace(); 
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接