2017-02-28 11 views
4

javaのjacksonを使用してjsonボディを構築しています。以下のようなものになりますジャクソンを使用してjson bodyの空の要素を無視する

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

異なるREST URIに基づいて、json本体はいくつかのフィールドまたは要素を無視する必要があります。 jacksonを使って上記のjson bodyから "student"の部分を無視するにはどうすればいいですか? 私はそれを無視すると、私は唯一の

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

を得ることができる必要がありますが、私はgetterとsetterを持つ2つのクラス、被写体としての1を持っている

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

incorrect-である以下のようにそれを取得していますもう1人は学生です。私は@JsonIgnoreを使ってみましたが、私は望んでいないすべてのURIを無視します。私も@JsonInclude(Include.NON_EMPTY)を試しました。これをどのように達成するのですか?

ここに自分のコードを追加しています。異なるREST URIに基づいて、JSON本体はいくつかのフィールドまたは要素を無視しなければなりません.1つの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

[Jackson Different JSONFilter same class]の複製があります。(http://stackoverflow.com/questions/27041544/jackson-different-jsonfilter-same-class) – toongeorges

答えて

1

EDIT

この投稿はduplicateのようです。

EDIT 2

代わりに以下@JsonFilter

の使用@JsonViewが同じJSONオブジェクトの異なるビューを印刷する@JsonViewを使用するサンプルコードである:

{ "被験者":" 数学」、 "マーク": "100"}

{ "対象": "数学"、 "マーク": "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

上記の返信に感謝します。上記の答えが働きます。しかし、要求されたURIに基づいてJSON本体が変更される場所を探しています。 1つのURIの例私は、学生とスコアのすべてをjson本文に含める必要があります。これは、学生を除外するために必要な別のURIです。上記の質問を自分のコードで編集しました。 – user2266817

+0

あなたのコメントは私には分かりません。 \ @JsonFilterの代わりに\ @JsonViewを使用するようにコードを変更しました。これによりコードがより洗練されたものになります。各URIがWebサービスメソッドにバインドされていると仮定します。これらのメソッドはそれぞれ異なるビューを使用できますか? – toongeorges

0

ObjectMapperでWRITE_NULL_MAP_VALUESをfalseに設定します。

コード:

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

これはNON_NULLなくNON_EMPTYの値とJsonIncludeを使用して、注釈に構成することができます。

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": "数学"、 "marks": "100"、 "student":{ "name": "x"、 "class": @JsonInclude(Include.NON_NULL)は "schoolList"ではなく "student"を無視することができます – user2266817

関連する問題