[英]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;
}
Name:null steam_appid:0 isInstalled:false
success
,如果value為true
,則將其解析為Game
。 否則,什么都不做。 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.