我正在使用杰克逊2。 从远程服务中读取时,我获得了一个JSON对象:
{
"country":"1",
"complex":{
"link":"...",
"value":"..."
},
"test":""
}
所以我为此目的创建了相关的POJO:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"link",
"value"
})
public class Complex {
@JsonProperty("link")
private String link;
@JsonProperty("value")
private String value;
@JsonProperty("link")
public String getLink() {
return link;
}
@JsonProperty("link")
public void setLink(String link) {
this.link = link;
}
@JsonProperty("value")
public String getValue() {
return value;
}
@JsonProperty("value")
public void setValue(String value) {
this.value = value;
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"country",
"complex",
"test"
})
public class Resource {
@JsonProperty("country")
private String country;
@JsonProperty("complex")
private Complex complex;
@JsonProperty("test")
private String test;
@JsonProperty("country")
public String getCountry() {
return country;
}
@JsonProperty("country")
public void setCountry(String country) {
this.country = country;
}
@JsonProperty("complex")
public Complex getComplex() {
return complex;
}
@JsonProperty("complex")
public void setComplex(Complex complex) {
this.complex = complex;
}
@JsonProperty("test")
public String getTest() {
return test;
}
@JsonProperty("test")
public void setTest(String test) {
this.test = test;
}
}
这样我才能做到:
Resource res = MAPPER.readValue(response.readEntity(String.class), Resource.class);
我的问题是,在执行POST请求时,我需要发送一个不同的对象,即:
{
"country":"1",
"complex": "value",
"test":""
}
所以"complex"
个对象必须只是字符串。
关于如何处理这种情况的任何想法?
我试图创建一个JsonDeserializer
类:
public class ComplexValueDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(final JsonParser parser, final DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
final JsonToken jsonToken = parser.getCurrentToken();
if (jsonToken == null
|| (jsonToken == JsonToken.START_OBJECT && parser.getValueAsString().equals("{}"))) {
return "";
}
return null;
}
}
并将其添加到:
@JsonProperty("complex")
@JsonDeserialize(using = ComplexValueDeserializer.class)
private Complex complex;
但我收到java.lang.IllegalArgumentException: argument type mismatch
错误。
谢谢!
答案 0 :(得分:1)
在复杂对象类型上,您可以定义toString()方法,然后使用@JsonValue对其进行批注。这将向Jackson表明返回的结果将是为该对象序列化的值。您可以实现您需要的任何逻辑,以您希望的方式表示Complex类型。 e.g:
@JsonValue
public String toString() {
return value;
}
答案 1 :(得分:0)
你为什么需要 &#34;复合&#34;:{ &#34;连结&#34;:&#34; ...&#34 ;, &#34;值&#34;:&#34; ...&#34; }, 对于api文档?