使用Retrofit将json结构转换为数组 [英] Convert json structure to array with Retrofit
本文介绍了使用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));
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屋!
查看全文