2017-10-06 104 views
0

我有一个很大的嵌套对象。我想在JSON字符串中序列化这个对象,但是我只需要包含某些字段。这里的问题是这些字段可能会非常频繁地更改,我想以一种可以帮助我轻松包含或排除字段进行序列化的方式来构建它。将对象序列化为json,仅限某些字段

我知道我可以编写很多代码来提取某些字段并“手动”构建JSON。但我想知道是否有其他优雅的方式来达到类似的结果,但指定了必填字段的列表?

例如具有以下的对象结构欲仅包括id并在响应name

class Building { 
    private List<Flat> flats; 
} 

class Flat { 
    private Integer id;  
    private Person owner; 
} 


class Person { 
    private String name; 
    private String surname; 
} 

JSON:

{ 
    "flats" : [ 
     { 
      "flat": 
      { 
       "id" : "1", 
       "person" : { 
        "name" : "John" 
       } 
      } 
     } 
    ] 
} 

回答

1

可以使用gson用于序列化/反序列化JSON。 然后,您可以包含@Expose注释以仅使用您需要的字段。

一定还要配置您的Gson对象以仅序列化“暴露”字段。

Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

备选:

实际上,你可以做到这一点的逆方式,标志着该领域不会暴露。您可以使用transient关键字执行此操作。 所以无论你想忽略,只需添加transient它。以下是gson的工作原理。

PS:这也适用于大部分Java JSON串行器。

+0

听起来不错,我会努力的!如果我将整个私人所有者字段标记为@Expose,它是否也会自动包含所有嵌套字段? –

+0

实际上,如果你想让它们串行化,你必须用'@ Expose'注释标记所有字段。我用另一种方式编辑答案,也读了,也许这更适合你。 – torque203

0

使用com.fasterxml.jackson.annotation.JsonIgnore是实现此目的的另一种方法。

import com.fasterxml.jackson.annotation.JsonIgnore; 

class Person { 
    private String name; 
    @JsonIgnore 
    private String surname; 
} 

当解析器将bean转换为json时,它将忽略surname。 其他json处理库中将提供类似的注释。

0

如果使用Gson,请学习如何使用ExclusionStrategy & JsonSerializer。

使用这些是一种更灵活的方式来控制序列化,因为它允许决定每个序列化序列化。

如果需要更改要序列化的内容,使用注释稍后需要在字段中添加/删除这些注释。

在你的例子中,后者可能更合适。

这个问题可能是很好的起始点 serialize-java-object-with-gson