0

我正在研究如何将 POJO 序列化为 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.
    }
}

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

这感觉像是一种 hacky 的做事方式。会有更好的解决方案吗?我一直在阅读有关使用杰克逊视图的信息,但我不确定这是否可能解决我的问题。

4

1 回答 1

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;
}
于 2012-08-08T13:55:18.553 回答