我正在研究如何将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上序列化,因此对象映射器不必选择使用哪个字段。
这感觉就像一种黑客的做事方式。会有更好的解决方案吗?我一直在阅读有关使用杰克逊观点的内容,但我不确定这是否可以解决我的问题。
答案 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;
}