使用Retrofit将json结构转换为数组 [英] Convert json structure to array with Retrofit

查看:118
本文介绍了使用Retrofit将json结构转换为数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Trakt.tv API中遇到Retrofit和丑陋的json对象:
$ b

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

episodes内容显然是动态的,我想将它作为一个简单的布尔数组来处理,如下所示: p>

  int season; 
布尔[]集;

如何做?

解决方案您可以先将JSON字符串转换为 Map< String,Object> 然后创建所需的对象。



示例代码:

  public class EpisodesDetail {
private int season;
私人布尔[]集;
// getter& setter
}
...

BufferedReader reader = new BufferedReader(new FileReader(new File(json.txt)));
Type type = new TypeToken< Map< String,Object>>(){} .getType();
地图< String,Object> map = new Gson()。fromJson(reader,type);

EpisodesDetail geometry = new EpisodesDetail(); $()(double)map.get(season))。intValue());
geometry.setSeason
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解串器



示例代码:

  class EpisodesDetailDeserializer实现了JsonDeserializer< EpisodesDetail> {
$ b @Override
public EpisodesDetail deserialize(final JsonElement json,final Type typeOfT,$ b $ final JsonDeserializationContext context)throws JsonParseException {

EpisodesDetail geometry = new EpisodesDetail();
JsonObject jsonObject = json.getAsJsonObject();
int season = jsonObject.get(season)。getAsInt();
geometry.setSeason(season);

列表<布尔> episodes = new ArrayList< Boolean>();
Set< Entry< String,JsonElement>> set = jsonObject.get(episodes)。getAsJsonObject()
.entrySet();

Iterator< Entry< String,JsonElement>> it = set.iterator(); (it.hasNext()){
episodes.add(it.next()。getValue()。getAsBoolean());
}
geometry.setEpisodes(episodes.toArray(new Boolean [] {}));
返回几何;



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解串器?


I'm in trouble with Retrofit and a ugly json object in the Trakt.tv API:

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

"episodes" content is obviously dynamic and I'd like to handle it as a simple Boolean array, like this:

int season;
Boolean[] episodes;

How to do that?

解决方案

You can first convert the JSON string into Map<String,Object> then finally create the desired object.

sample code:

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

output:

{
  "season": 1,
  "episodes": [
    true,
    true,
    false,
    false,
    false,
    false,
    false
  ]
}


There is one more approach using GSON Deserialiser

sample code:

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

See How do I write a custom JSON deserializer for Gson?

这篇关于使用Retrofit将json结构转换为数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆