簡體   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