2012-08-08 62 views
0

我正在研究如何將POJO序列化爲json字符串。我正在使用傑克遜庫並遇到問題。將類成員序列化爲JSON對象

在JSON對象的值可以是一個字符串或字符串數​​組是這樣的...

{"mimeTypes":"all"} 

{"mimeTypes":["application/pdf", "application/msword"]} 

這是我此刻的

@JsonIgnore 
private String mimeTypes; 
@JsonIgnore 
private String[] mimeTypesArray; 
@JsonRawValue 
@JsonProperty("integration/enabled-mime-types") 
private String mimeType; 

public void setMimeTypes(String mimeTypes) { 
    this.mimeTypes = mimeTypes; 
    mimeType = mimeTypes; 
} 

public void setMimeTypes(String[] mimeTypes) { 
    this.mimeTypesArray = mimeTypes; 
    try { 
     JSONArray jsonArray = new JSONArray(mimeTypes); 
     this.mimeType = jsonArray.toString(); 
    } catch (JSONException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
} 
方法

基本上我有一個字符串字段,一個字符串數組的字段,以及一個字符串字段,我想添加到t他是json的對象。我在setter上串行化,所以對象映射器不必選擇使用哪個字段。

這種感覺就像是一種拙劣的做事方式。會有更好的解決方案嗎?我一直在閱讀關於使用傑克遜視圖,但我不知道這是否可能爲我的問題。

回答

1

我沒有測試過,但我想嘗試增加專用的方法來計算應該怎樣連載:

class MyMimeTypes { 
    @JsonIgnore 
    private String[] mimeTypesArray; 

    /** A convenience method for setting just one item. */ 
    public void setMimeType(String mimeType) { 
     this.mimeTypesArray = new String[] { mimeType }; 
    } 

    public void setMimeTypes(String[] mimeTypes) { 
     this.mimeTypesArray = mimeTypes; 
    } 

    // The JSON-specific part: 

    @JsonProperty("mimeTypes") 
    public Object jsonMimeTypes() { 
     if (mimeTypesArray.length == 1) 
      return mimeTypesArray[0]; 
     else 
      return mimeTypesArray; 
    } 
} 

這樣一來,如果陣列中只有一個項目,序列化價值將只是項目。否則整個數組將被序列化。

請注意,具有兩個具有相同名稱和不同簽名的設置程序是一種不好的做法。違反Java Beans規範的AFAIK。

也許你可以使用一個可變參數的方法我更換兩個設置方法(但我不知道如何去這與Java Beans規範一起):

public void setMimeTypes(String... mimeTypes) { 
    this.mimeTypesArray = mimeTypes; 
} 
+0

它與可變參數很好地工作。感謝那! – jiduvah 2012-08-08 15:34:02

+0

我剛剛意識到可變參量並不適用於反序列化 – jiduvah 2012-08-14 09:45:07