Java GSON-fromJSON反序列化,带有条件以排除特定对象实例
给出以下JSON响应:Java GSON-fromJSON反序列化,带有条件以排除特定对象实例,java,android,json,deserialization,gson,Java,Android,Json,Deserialization,Gson,给出以下JSON响应: { "status": "OK", "regions": [ { "id": "69", "name": "North Carolina Coast", "color": "#01162c", "hasResorts": 1 }, { "id": "242", "na
{
"status": "OK",
"regions": [
{
"id": "69",
"name": "North Carolina Coast",
"color": "#01162c",
"hasResorts": 1
},
{
"id": "242",
"name": "North Carolina Inland",
"color": "#01162c",
"hasResorts": 0
},
{
"id": "17",
"name": "North Carolina Mountains",
"color": "#01162c",
"hasResorts": 1
},
{
"id": "126",
"name": "Outer Banks",
"color": "#01162c",
"hasResorts": 1
}
]
}
我正在尝试创建一个区域对象列表。下面是我当前代码的一个非常简短的版本:
JSONObject jsonObject = new JSONObject(response);
String regionsString = jsonObject.getString("regions");
Type listType = new TypeToken<ArrayList<Region>>() {}.getType();
List<Region> regions = new Gson().fromJson(regionsString, listType);
JSONObject JSONObject=新的JSONObject(响应);
String RegionString=jsonObject.getString(“区域”);
类型listType=newTypeToken(){}.getType();
List regions=new Gson().fromJson(regionString,listType);
这一切都很好。但是,我想排除最终列表中hasrorts==0的区域。我意识到我可以在每个区域上调用fromJSON之前循环实际的JSONObject并检查它们。但我假设有一个GSON特定的方法来实现这一点
我正在看排除策略()。有没有一种简单的方法来实现JSON反序列化?
排除策略对您没有帮助,因为它在没有反序列化上下文的情况下工作。实际上,您只能排除特定类型的类。我认为最好的方法是通过自定义反序列化。以下是我的意思(您可以立即复制粘贴并尝试):
package stackoverflow.questions.q19912055;
导入java.lang.reflect.Type;
导入java.util.*;
导入stackoverflow。问题。q17853533。*;
导入com.google.gson.*;
导入com.google.gson.reflect.TypeToken;
公开课Q19912055{
阶级地区{
字符串id;
字符串名;
字符串颜色;
整数度假酒店;
@凌驾
公共字符串toString(){
return“Region[id=“+id+”,name=“+name+”,color=“+color
+“,hasrorts=“+hasrorts+”]”;
}
}
静态类RegionDeserializer实现JsonDeserializer{
公共列表反序列化(JsonElement json,类型typeOfT,
JsonDeserializationContext)抛出JsonParseException{
if(json==null)
返回null;
ArrayList al=新的ArrayList();
for(JsonElement e:json.getAsJsonArray()){
布尔反序列化=e.getAsJsonObject().get(“hasResorts”)
.getAsInt()>0;
if(反序列化)
al.add((Region)context.deserialize(e,Region.class));
}
返回al;
}
}
/**
*@param args
*/
公共静态void main(字符串[]args){
字符串json=
" [ "+
" { "+
“\“id\”:\“69\”+
“\”姓名\“:\”北卡罗来纳州海岸\“+
“颜色”:“01162c”+
“\“hasResorts\”:1”+
" }, "+
" { "+
“\“id\”:\“242\”+
“\”名称\“:\”北卡罗来纳州内陆\“,”+
“颜色”:“01162c”+
“\“hasResorts\”:0”+
" }, "+
" { "+
“\“id\”:\“17\”+
““名称”:“北卡罗来纳州山脉”+
“颜色”:“01162c”+
“\“hasResorts\”:1”+
" }, "+
" { "+
“\“id\”:\“126\”+
“\”名称“:\”外部银行“,”+
“颜色”:“01162c”+
“\“hasResorts\”:1”+
" } "+
" ] ";
类型listType=newTypeToken(){}.getType();
List allRegions=new Gson().fromJson(json,listType);
System.out.println(所有区域);
GsonBuilder=新的GsonBuilder();
registerTypeAdapter(listType,new RegionSerializer());
Gson gson2=builder.create();
List regionsHaveResort=gson2.fromJson(json,listType);
System.out.println(regionsHaveResort);
}
}
就是这样。谢谢这是我在StackOverflow上读到的最好的答案之一。谢谢!
package stackoverflow.questions.q19912055;
import java.lang.reflect.Type;
import java.util.*;
import stackoverflow.questions.q17853533.*;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
public class Q19912055 {
class Region {
String id;
String name;
String color;
Integer hasResorts;
@Override
public String toString() {
return "Region [id=" + id + ", name=" + name + ", color=" + color
+ ", hasResorts=" + hasResorts + "]";
}
}
static class RegionDeserializer implements JsonDeserializer<List<Region>> {
public List<Region> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
if (json == null)
return null;
ArrayList<Region> al = new ArrayList<Region>();
for (JsonElement e : json.getAsJsonArray()) {
boolean deserialize = e.getAsJsonObject().get("hasResorts")
.getAsInt() > 0;
if (deserialize)
al.add((Region) context.deserialize(e, Region.class));
}
return al;
}
}
/**
* @param args
*/
public static void main(String[] args) {
String json =
" [ "+
" { "+
" \"id\": \"69\", "+
" \"name\": \"North Carolina Coast\", "+
" \"color\": \"#01162c\", "+
" \"hasResorts\": 1 "+
" }, "+
" { "+
" \"id\": \"242\", "+
" \"name\": \"North Carolina Inland\", "+
" \"color\": \"#01162c\", "+
" \"hasResorts\": 0 "+
" }, "+
" { "+
" \"id\": \"17\", "+
" \"name\": \"North Carolina Mountains\", "+
" \"color\": \"#01162c\", "+
" \"hasResorts\": 1 "+
" }, "+
" { "+
" \"id\": \"126\", "+
" \"name\": \"Outer Banks\", "+
" \"color\": \"#01162c\", "+
" \"hasResorts\": 1 "+
" } "+
" ] ";
Type listType = new TypeToken<ArrayList<Region>>() {}.getType();
List<Region> allRegions = new Gson().fromJson(json, listType);
System.out.println(allRegions);
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(listType, new RegionDeserializer());
Gson gson2 = builder.create();
List<Region> regionsHaveResort = gson2.fromJson(json, listType);
System.out.println(regionsHaveResort);
}
}