将类成员序列化为JSON对象

时间:2012-08-08 13:23:30

标签: java android jackson

我正在研究如何将POJO序列化为json字符串。我正在使用jackson库并遇到了问题。

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.
    }
}

基本上我有字符串的字段,字符串数组的字段,以及我想要添加到json对象的字符串的字段。我在setter上序列化,因此对象映射器不必选择使用哪个字段。

这感觉就像一种黑客的做事方式。会有更好的解决方案吗?我一直在阅读有关使用杰克逊观点的内容,但我不确定这是否可以解决我的问题。

1 个答案:

答案 0 :(得分: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;
    }
}

这样,如果数组中只有一个项目,则序列化值将只是项目。否则整个数组将被序列化。

请注意,有两个具有相同名称和不同签名的setter是不好的做法。违反Java Beans规范的AFAIK。

也许您可以在这里使用vararg方法来替换这两个setter(但我不知道它如何与Java Beans规范一起使用):

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