2017-02-28 54 views
4

我正在用java中的jackson構造一個json體。它會像下面忽略來自json body的使用jackson的空元素

{ 
    "subject": "math", 
    "marks": "100", 
    "student":{ 
     "name": "x", 
     "class": "8" 
    } 
} 

基於不同REST URI的JSON的身體已經忽略某些字段或元素。我如何使用jackson忽略上述json主體中的「學生」部分? 當我不理它,我應該能夠得到的只有

{ "subject": "math", "marks": "100"} 

,但我得到它下面是引線不

{ "subject": "math", "marks": "100","student":{}} 

我有兩個班,getter和setter,一個爲主體另一個是學生。我嘗試使用@JsonIgnore,但它忽略了所有的URI,我不想要。我也試過@JsonInclude(Include.NON_EMPTY)。我如何實現這一目標?

我在這裏添加我的代碼。基於不同的REST URI,json主體必須忽略一些字段或元素。例如,對於一個URI,它應該包含所有字段,對於另一個URI則應該忽略學生。 分數=新分數();

score.setSubject("math"); 
    score.setMarks("100"); 

    Score.Student student =score.new Student(); 
    score.setStudent(student); 

    switch (type) { 
    case StudentAdd: 
     score.setSubject("math"); 
     score.setMarks("100"); 
     break; 
    case StudentDelete: 
     score.setSubject("math"); 
     score.setMarks("100"); 
     break; 
    case StudentComplete: 
     score.setChangeReason("C"); 

    default: 
     break; 
     score.setSubject("math"); 
     score.setMarks("100"); 

    score.setStudent(student); 

    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); 
    //objectMapper.setSerializationInclusion(Include.NON_NULL); 
    objectMapper.setSerializationInclusion(Include.NON_EMPTY); 

    StringWriter jsonBody = new StringWriter(); 
    objectMapper.writeValue(jsonBody, score); 

    return jsonBody.toString(); 
} 

    //@JsonInclude(Include.NON_EMPTY) 
    class Score { 

     private String subject; 
     private String marks; 
     private Student student; 

     public String getSubject() { 
      return subject; 
     } 

     public void setSubject(String subject) { 
      this.subject = subject; 
     } 

     public String getMarks() { 
      return marks; 
     } 

     public void setMarks(String marks) { 
      this.marks = marks; 
     } 

     public Student getStudent() { 
      return student; 
     } 

     public void setStudent(Student student) { 
      this.student = student; 
     } 

    //@JsonInclude(Include.NON_NULL) 
    class Student { 

     private String name; 

     @JsonProperty("class") 
     private String clazz; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getClazz() { 
      return clazz; 
     } 

     public void setClazz(String clazz) { 
      this.clazz = clazz; 
     } 

} 
    } 
    } 
    } 
+0

[傑克遜不同的JSONFilter同一類]的可能的重複(http://stackoverflow.com/questions/27041544/jackson-different-jsonfilter-same-class) – toongeorges

回答

1

EDIT

此帖子似乎是一個duplicate

編輯2

使用@JsonView代替@JsonFilter

下面是使用@JsonView打印相同JSON對象的不同視圖的示例代碼:

{「受試者「:」math「,」marks「:」100「}

and

{ 「主題」: 「數學」, 「標誌」: 「100」, 「學生」:{ 「名」: 「X」, 「階級」: 「8」}}

public class Views { 
    public static class Filtered {} 
    public static class All extends Filtered {} 
} 

public class Student { 
    private String name; 

    @JsonProperty("class") 
    private String clazz; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getClazz() { 
     return clazz; 
    } 

    public void setClazz(String clazz) { 
     this.clazz = clazz; 
    } 
} 

public class Score { 
    @JsonView(Views.Filtered.class) 
    private String subject; 

    @JsonView(Views.Filtered.class) 
    private String marks; 

    @JsonView(Views.All.class) 
    private Student student; 

    public String getSubject() { 
     return subject; 
    } 

    public void setSubject(String subject) { 
     this.subject = subject; 
    } 

    public String getMarks() { 
     return marks; 
    } 

    public void setMarks(String marks) { 
     this.marks = marks; 
    } 

    public Student getStudent() { 
     return student; 
    } 

    public void setStudent(Student student) { 
     this.student = student; 
    } 
} 

public class JsonTest { 
    public static void main(String[] args) throws JsonProcessingException { 
     Student student = new Student(); 
     student.setName("x"); 
     student.setClazz("8"); 

     Score score = new Score(); 
     score.setSubject("math"); 
     score.setMarks("100"); 
     score.setStudent(student); 

     ObjectMapper mapper = new ObjectMapper(); 

     //do not serialize student property 
     System.out.println(mapper.writerWithView(Views.Filtered.class).writeValueAsString(score)); 

     //also serialize student property 
     System.out.println(mapper.writeValueAsString(score)); 
    } 
} 
+0

感謝上述回覆。以上答案有效。但是我正在尋找json體基於請求的URI而改變的地方。一個URI的示例我需要在json主體中包含學生和樂譜中的所有內容,另一個URI用於排除學生。我用我的代碼編輯了我的問題。 – user2266817

+0

您的評論對我而言並不清楚。我更改了代碼以使用\ @JsonView,而不是\ @JsonFilter,這會導致更簡潔的代碼。我假設每個URI都綁定到一個Web服務方法。這些方法可以分別使用不同的視圖? – toongeorges

0

在您的ObjectMapper中將WRITE_NULL_MAP_VALUES設置爲false。

代碼:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false); 
3

這可以使用與JsonIncludeNON_NULL而非NON_EMPTY值註釋進行配置。

NON_EMPTY與NON_NULL的Javadoc不太清晰,但我的實驗顯示,使用NON_NULL的效果與您預期的那樣使用Jackson 2.6.2。

@JsonProperty 
@JsonInclude(Include.NON_NULL) 
private Student student; 

ObjectMapper mapper = new ObjectMapper(); 
System.out.println(mapper.writeValueAsString(new Foo(100, new Student("bob"), "math"))); 
System.out.println(mapper.writeValueAsString(new Foo(100, null, "math"))); 

輸出

{"marks":100,"subject":"math","student":{"name":"bob"}} 
{"marks":100,"subject":"math"} 

注意這也可以使用全局設置

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
+0

我有NON_NULL的地方,它適用於某些和不爲其他人工作。例如:我的原始json是這樣的 - { 「subject」:「math」, 「marks」:「100」, 「student」:{ 「name」:「x」, 「class」: 「8」 ,「schoolList」:[{「school」:「abc」}] } @JsonInclude(Include.NON_NULL)能夠忽略「schoolList」而不是「student」 – user2266817