代码之家  ›  专栏  ›  技术社区  ›  userDSSR

如何配置使用GSON将哪些POJO字段序列化为JSON?

  •  3
  • userDSSR  · 技术社区  · 8 年前

    我有一个包含多个字段的对象列表。根据API调用,列表将仅返回一组特定的字段。当我使用transient时,它不会序列化该特定字段。但是,应该为另一个API调用返回该字段。我正在使用Gson。

    在下面的示例中,基于API,我想打印一个表实例列表,其中仅包含表实例的“name”,或同时包含“name”和“location”,或仅包含location。表对象中可能有30个字段。

    一种方法是将其映射到每个场景的POJO,然后将其打印出来。有没有更好的方法?您可以在其中选择/选择/约束要序列化的字段。

    例如。

    package Testing;
    
    import java.util.ArrayList;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class TestJson {
    
        public static Gson obGson = new GsonBuilder().setPrettyPrinting().create();
    
        public static void main(String[] args) {
    
            ArrayList<Table> myTable = new ArrayList<Table>();
    
            myTable.add(new Table("John", "Chicago"));
            myTable.add(new Table("David", "Seattle"));
            myTable.add(new Table("June", "Dallas"));
    
            System.out.println(obGson.toJson(myTable));
    
        }
    
    }
    
    class Table {
    
        String name;
        String location;
    
        public Table (String _name, String _location) {
    
            name        = _name;
            location    = _location;
    
        }
    }
    

    上面的输出如下所示。调用API-1时,输出应如下所示。

    [
      {
        "name": "John",
        "location": "Chicago"
      },
      {
        "name": "David",
        "location": "Seattle"
      },
      {
        "name": "June",
        "location": "Dallas"
      }
    ]
    

    但是当调用API-2时,输出应该如下所示。仅返回批准用于该API调用的字段。

    [
      {
        "name": "John"
      },
      {
        "name": "David"
      },
      {
        "name": "June"
      }
    ]
    

    类似地,可以基于API调用管理返回。

    1 回复  |  直到 8 年前
        1
  •  3
  •   pirho    8 年前

    使生效 ExclusionStrategy 喜欢

    @RequiredArgsConstructor
    public class FieldExclusionStrategy implements ExclusionStrategy { 
    
       @NonNull
       private final Collection<String> serializedFields;
    
       @Override
       public boolean shouldSkipField(FieldAttributes f) {
          if(serializedFields.contains(f.getName())) return false;
          return true;
       }
    
       @Override
       public boolean shouldSkipClass(Class<?> clazz) { return false; }
    
    }
    

    使用like

    @Test
    public void testShouldSkipField() {
    
       Gson gson;      
       Table table = new Table();
    
       Collection<String> serializedFields = new ArrayList<>();
    
       ArrayList<Table> myTable = new ArrayList<Table>();
       myTable.add(new Table("John", "Chicago"));
       myTable.add(new Table("David", "Seattle"));
       myTable.add(new Table("June", "Dallas"));
    
       serializedFields.add("name");
       gson = new GsonBuilder()
             .setPrettyPrinting()
             .addSerializationExclusionStrategy(
                    new FieldExclusionStrategy(serializedFields))
             .create();
       log.info("\n{}", gson.toJson(myTable));      
    
       serializedFields.add("location");      
       gson = new GsonBuilder()
             .setPrettyPrinting()
             .addSerializationExclusionStrategy(
                    new FieldExclusionStrategy(serializedFields))
             .create();
       log.error("\n{}", gson.toJson(myTable));      
    
       serializedFields.remove("name");      
       gson = new GsonBuilder()
             .setPrettyPrinting()
             .addSerializationExclusionStrategy(
                    new FieldExclusionStrategy(serializedFields))
             .create();
       log.error("\n{}", gson.toJson(myTable));      
    
    }
    

    上面会记录如下内容

    2017-12-23 19:47:17.028信息组织。实例格森。FieldExclutionStrategyTest:37-
    [
    {
    “name”:“John”
    },
    {
    “name”:“David”
    },
    {
    “name”:“June”
    }
    ]
    2017-12-23 19:47:17.034错误组织。实例格森。FieldExclutionStrategyTest:44-
    [
    {
    “name”:“John”,
    “地点”:“芝加哥”
    },
    {
    “name”:“David”,
    “地点”:“西雅图”
    },
    {
    “name”:“June”,
    “地点”:“达拉斯”
    }
    ]
    2017-12-23 19:47:17.035错误组织。实例格森。FieldExclutionStrategyTest:51-
    [
    {
    “地点”:“芝加哥”
    },
    {
    “地点”:“西雅图”
    },
    {
    “地点”:“达拉斯”
    }
    ]

    您需要构建 GSON 再次更改序列化字段名列表后。

    GSON公司 第一次调用某个字段名时,在内部缓存结果true | false,并且不会再次查询缓存的字段名。

    并添加 排除策略 您需要构建 GSON公司 具有 GsonBuilder 然后注册 排除策略 (或其中许多)。

    另请参见 my question 关于此主题。