2012-08-08 64 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