GSON fromJSON Deserialization with Conditional to Exclude specific Object Instances

时间:2013-11-11 17:14:56

标签: java android json deserialization gson

给出以下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
        }
    ]
}

我正在尝试创建Region对象列表。这是我当前代码的一个非常简略的版本:

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

这一切都很好。但是,我想排除最终List中hasResorts == 0的区域。我意识到我可以遍历实际的JSONObjects并在每个区域调用fromJSON之前检查它们。但我假设有一种GSON特定的方式来做到这一点。

我在看ExclusionStrategy()。有没有一种简单的方法来实现JSON反序列化?

1 个答案:

答案 0 :(得分:2)

ExclusionStrategy对您没有帮助,因为它没有反序列化的上下文。实际上,您只能排除某种特定类别。我认为最好的方法是通过自定义反序列化。这就是我的意思(你可以复制和粘贴并立即尝试):

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

    }

}