2014-06-24 74 views
2

我有一個類,我使用Jackson序列化/反序列化JSON和XML。相當於@JsonIgnore,但只適用於使用Jackson的xml字段/屬性轉換

public class User { 
    Integer userId; 
    String name; 
    Integer groupId; 
... 
} 

我想要做的XML處理時忽略的groupId,所以我的個XML將不包括它:

<User> 
<userId>...</userId> 
<name>...</name> 
</User> 

但JSONs將:

{ 
    "userId":"...", 
    "name":"...", 
    "groupId":"..." 
} 

我知道@JsonIgnore將在兩個工作,但我只想在xml中忽略它。

我知道可以用來做到這一點的混合註釋(https://stackoverflow.com/a/22906823/2487263),但我認爲應該有一個簡單的註釋來做到這一點,但找不到它。傑克遜的文檔(至少對我來說)在嘗試找到這些東西時並不像我想的那麼好。

+0

你怎麼序列化/反序列化XML?你在使用XML映射器嗎? –

+0

是的,XML映射器 – raspacorp

回答

5

傑克遜不支持開箱即用。但是你可以用the Jackson json views或創建將通過the annotation interospector.

這裏被解釋爲XML映射爲@JsonIgnore自定義的註釋是一個例子:

public class JacksonXmlAnnotation { 
    @Retention(RetentionPolicy.RUNTIME) 
    public static @interface JsonOnly { 
    } 

    @JacksonXmlRootElement(localName = "root") 
    public static class User { 
     public final Integer userId; 
     public final String name; 
     @JsonOnly 
     public final Integer groupId; 

     public User(Integer userId, String name, Integer groupId) { 
      this.userId = userId; 
      this.name = name; 
      this.groupId = groupId; 
     } 
    } 

    public static class XmlAnnotationIntrospector extends JacksonXmlAnnotationIntrospector { 
     @Override 
     public boolean hasIgnoreMarker(AnnotatedMember m) { 
      return m.hasAnnotation(JsonOnly.class) || super.hasIgnoreMarker(m); 
     } 
    } 

    public static void main(String[] args) throws JsonProcessingException { 
     User user = new User(1, "John", 23); 
     XmlMapper xmlMapper = new XmlMapper(); 
     xmlMapper.setAnnotationIntrospector(new XmlAnnotationIntrospector()); 
     ObjectMapper jsonMapper = new ObjectMapper(); 
     System.out.println(xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user)); 
     System.out.println(jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user)); 
    } 
} 

輸出:

<root> 
    <userId>1</userId> 
    <name>John</name> 
</root> 
{ 
    "userId" : 1, 
    "name" : "John", 
    "groupId" : 23 
} 
+0

我試過你的方法,它在忽略屬性上工作,但是當我使用introspector時,它也忽略了所有其他的jackson註釋:「@JacksonXmlRootElement」,「@JacksonXmlProperty」等。 – raspacorp

+1

@raspacorp good catch !我已經更新了我的答案。現在自定義introspector從Jackson XML模塊中擴展JacksonXmlAnnotationIntrospector。 –

+0

當我使用'@JsonProperty(value =「change_json_prop_name」)'來更改默認的JSON屬性名稱時,'@ JsonOnly'註解將不起作用。有一個功能來解決這個問題嗎? – bluearrow

相關問題