繁体   English   中英

如何获取和忽略JSON中的特定字段

[英]How to get and ignore specific field in JSON

游戏类别:

public class Game {
  private String name;
  private int steam_appid;
  private boolean isInstalled;
}

Json示例: https ://store.steampowered.com/api/appdetails/ ? appids = 435150 & filters = basic

我的尝试:

public static Game readJson(String gameID) throws IOException {
    String targetURL = String.format(STEAM_API, gameID);
    URL url = new URL(targetURL);
    InputStreamReader reader = new InputStreamReader(url.openStream());
    Gson gson = new Gson();
    Game json = gson.fromJson(reader, Game.class);
    return json;
}
  1. 当我尝试打印输出时,得到Name:null steam_appid:0 isInstalled:false
  2. 我想先检查密钥success ,如果value为true ,则将其解析为Game 否则,什么都不做。
    我如何解析Json到我的Game

如果一个字段被标记为transient ,(默认情况下),它将被忽略并且不包含在JSON序列化或反序列化中。

https://sites.google.com/site/gson/gson-user-guide#TOC-Finer-Points-with-Objects

如果您不想在json中包含名称,请使用以下代码:

public class Game 
{
  private transient String name;
  private int steam_appid;
  private boolean isInstalled;
}

选项1: 在字段级别忽略字段

public class Game {
  private String name;

  @JsonIgnore
  private int steam_appid;
  private boolean isInstalled;
}

我们也可以直接通过@JsonIgnore批注直接忽略该字段:

选项2:您可以使用@JsonIgnoreProperties注释以另一种方式跳过pojo属性。 这是代码段:可以使用任何一种方法。

@JsonIgnoreProperties({ "name", "steam_appid" })
public class Game {
  private String name;
  private int steam_appid;
  private boolean isInstalled;
}

根据响应示例,使用Gson的类应如下所示:

请注意,这些类需要添加getter和setter。

class SteamResponseWrapper{
  @SerializedName("434150")
  private SteamResponse steamResponse;
}

class SteamResponse{
  boolean success;
  GameData data;
}

class GameData {
  String name;
  int steam_appid;
  // I couldn't find the isInstalled property if you are adding it, make it transient
}

通过这种结构,您将调用:
SteamResponseWrapper wrapper = new Gson().fromJson(reader, SteamResponseWrapper.class)
接着
wrapper.getSteamResponse().isSuccess()
检查成功字段。

wrapper.getSteamResponse().getData()
访问游戏对象。

但是我看到的问题是,顶级对象名称实际上是数据,并且对于每个游戏都会改变。 因此,我认为Gson无法处理此问题,因为对于每个请求,带注释的序列化名称都应该不同。

我认为您最好使用Jackson或JsonObject来处理它。

编辑我

此示例使用以下Maven依赖项:

<dependency>
        <groupId>javax.json</groupId>
        <artifactId>javax.json-api</artifactId>
        <version>1.0</version>
 </dependency>

<dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.json</artifactId>
      <version>1.0.4</version>
</dependency>  

这个例子:

public class SteamApiReader {
    private static final String STEAM_API = "http:// ......";
    public static void main(String args[]) {
        try {
            SteamApiReader.readJson("435150");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Game readJson(String gameID) throws IOException {
        Game rtn = null;
        String targetURL = String.format(STEAM_API, gameID);;
        URL url = new URL(targetURL);
        InputStreamReader reader = new InputStreamReader(url.openStream());

        JsonReader jsonReader = Json.createReader(reader);
        JsonStructure jsonStructure = jsonReader.read();

        JsonObject jsonObject = (JsonObject) jsonStructure;
        JsonObject wrapper = jsonObject.getJsonObject(gameID);
        boolean success = wrapper.getBoolean("success");
        if(success) {
            JsonObject data = wrapper.getJsonObject("data");
            String name = data.getString("name");
            int steamAppId = data.getInt("steam_appid");
            rtn =  new Game(name, steamAppId);
        }

        return rtn;
    }

    public static class Game{
        public Game(String name, int steamAppId) {
            this.name = name;
            this.steamAppId = steamAppId;
        }

        String name;
        int steamAppId;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM