簡體   English   中英

使用Retrofit將json結構轉換為數組

[英]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));

請參閱如何為Gson編寫自定義JSON反序列化程序?

當我使用jackson庫來解析那個JSON時,我使用ObjectMapperDramaInfo類如下。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM