java - 使用 Retrofit 将 json 结构转换为数组

标签 java gson retrofit

我在 Trakt.tv API 中遇到了 Retrofit 和丑陋的 json 对象的问题:

{
    "season": 1,
    "episodes": {
        "1": true,
        "2": true,
        "3": false,
        "4": false,
        "5": false,
        "6": false,
        "7": false
    }
}

“剧集”内容显然是动态的,我想将其作为一个简单的 boolean 数组来处理,如下所示:

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));

参见 How do I write a custom JSON deserializer for Gson?

关于java - 使用 Retrofit 将 json 结构转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100402/

相关文章:

java - 在 Apache-Cassandra 0.8.2 中插入 JSON 字符串

java - name 属性似乎在 Field 中不起作用

java - 我如何优化这个逻辑?

java - 由于缺少私有(private)字段,将 json 解析为 myObj 失败

android - 在嵌套的 JSON 对象中使用 Retrofit

java - 每次推送消息时AWS SQS : Is it a way SQS call me consumer,

java - 使用 GSON with object 打印 JSON 对象

android - Kotlin 字段覆盖和 GSON 反序列化 Unable to create converter class 异常

java - 如何从android中的嵌套对象访问setter?

android - 使用 Retrofit 搜索 api