[英]Convert json structure to array with Retrofit
我在Trakt.tv API中使用Retrofit和丑陋的json對象時遇到了麻煩:
{
"season": 1,
"episodes": {
"1": true,
"2": true,
"3": false,
"4": false,
"5": false,
"6": false,
"7": false
}
}
“劇集”內容顯然是動態的,我想把它作為一個簡單的布爾數組來處理,如下所示:
int season;
Boolean[] episodes;
怎么做?
您可以先將JSON字符串轉換為Map<String,Object>
然后最終創建所需的對象。
示例代碼:
public class EpisodesDetail {
private int season;
private Boolean[] episodes;
// getter & setter
}
...
BufferedReader reader = new BufferedReader(new FileReader(new File("json.txt")));
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> map = new Gson().fromJson(reader, type);
EpisodesDetail geometry = new EpisodesDetail();
geometry.setSeason(((Double) map.get("season")).intValue());
geometry.setEpisodes(((Map<String, Boolean>) map.get("episodes")).values().toArray(
new Boolean[] {}));
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(geometry));
輸出:
{
"season": 1,
"episodes": [
true,
true,
false,
false,
false,
false,
false
]
}
還有一種方法是使用GSON Deserialiser
示例代碼:
class EpisodesDetailDeserializer implements JsonDeserializer<EpisodesDetail> {
@Override
public EpisodesDetail deserialize(final JsonElement json, final Type typeOfT,
final JsonDeserializationContext context) throws JsonParseException {
EpisodesDetail geometry = new EpisodesDetail();
JsonObject jsonObject = json.getAsJsonObject();
int season = jsonObject.get("season").getAsInt();
geometry.setSeason(season);
List<Boolean> episodes = new ArrayList<Boolean>();
Set<Entry<String, JsonElement>> set = jsonObject.get("episodes").getAsJsonObject()
.entrySet();
Iterator<Entry<String, JsonElement>> it = set.iterator();
while (it.hasNext()) {
episodes.add(it.next().getValue().getAsBoolean());
}
geometry.setEpisodes(episodes.toArray(new Boolean[] {}));
return geometry;
}
}
BufferedReader reader = new BufferedReader(new FileReader(new File("json.txt")));
EpisodesDetail episodesDetail = new GsonBuilder()
.registerTypeAdapter(EpisodesDetail.class, new EpisodesDetailDeserializer())
.create().fromJson(reader, EpisodesDetail.class);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(episodesDetail));
當我使用jackson
庫來解析那個JSON時,我使用ObjectMapper
和DramaInfo
類如下。
package jackson;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.fasterxml.jackson.databind.ObjectMapper;
class DramaInfo {
int season;
List<Boolean> episodes;
public void setSeason(int season) {
this.season = season;
}
public int getSeason() {
return this.season;
}
public List<Boolean> getEpisodes() {
return new LinkedList<>( this.episodes );
}
public void setEpisodes(Map<String, Boolean> o) {
// used Java 1.8 Stream.
// just see http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
episodes = o.keySet().stream().map(e -> o.get(e)).collect(Collectors.toList());
}
public String toString() {
String ret = "season: " + this.season + "\n";
ret += this.episodes.toString();
return ret;
}
}
public class LoadJsonData {
public static void main(String[] args) {
String toConvert = "{\"season\": 1, \"episodes\": { \"1\": true, \"2\": true, \"3\": false, \"4\": false, \"5\": false, \"6\": false, \"7\": false } }";
ObjectMapper mapper = new ObjectMapper();
try {
DramaInfo info = mapper.readValue(toConvert, DramaInfo.class);
System.out.println(info);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
所以,這是一個建議,因為我從未使用過Retrofit。 如果您DramaInfo
如下方式使用Retrofit,那么如何嘗試上面顯示的DramaInfo
類?
public interface DramaService {
@GET("/dramas/{drama}/info")
DramaInfo listRepos(@Path("drama") String drama);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.