Java GSON-fromJSON反序列化,带有条件以排除特定对象实例

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

给出以下JSON响应:

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

    }

}