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

标签 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
        }
    ]
}

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

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

这一切都工作正常。但是,我想排除最终列表中 hasResorts == 0 的区域。我意识到我可以循环遍历实际的 JSONObjects 并在对每个区域调用 fromJSON 之前检查它们。但我假设有一种 GSON 特定的方法可以做到这一点。

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

最佳答案

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

    }

}

关于java - GSON fromJSON 反序列化,有条件排除特定对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19912055/

相关文章:

具有可选列出参数的 Java 函数

java - 如何将多个 JasperPrint 对象组合成一个具有混合页面方向的报告

java.lang.NumberFormatException - 找不到错误所在

android - 如何隐藏应用程序不显示在菜单中

java - Android Java:更新seekbar以在播放音频文件时显示进度

jquery - 使用 jQuery 从无序列表中输出 JSON 对象

java - 创建 session 和 cookie 之间的区别?

Android - 关于 fragment

javascript - d3.js:访问向下嵌套 2 级的数据

json - 如何仅提取标题和艺术家?