我正在使用Spring的RestTemplate来访问restful Web服务,并获得非标准的JSON。
我的意思是:
{
...
rules : {
matched : "rule one",
matched : "rule B",
matched : "another rule"
}
...
}
所以基本上我需要这个哈希映射到一个列表。在我的pojo中,我希望字段看起来像这样:
private List<String> rules; // once parsed, should contain "rule one",
// "rule B", "another rule", etc
以下是我迄今为止所做的尝试。这是我的序列化程序:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class MapValuesToListSerializer extends JsonSerializer<Map<?, ?>> {
@Override
public void serialize(Map<?, ?> map, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
serializerProvider.defaultSerializeValue(map.values(), jsonGenerator);
}
}
在我的POJO中,我对我的字段进行了如下注释:
@JsonSerialize(using = MapValuesToListSerializer.class)
private List<String> rules;
这行不通。标准字段都可以正确序列化,但不包括符合此字段的非标准字段。我错过了一个重要的部分,但我不知道是什么。
虽然我完全同意JB Nizet
的说法,"如果这是你自己的网络服务之一,就修复它。"由于它的强大,这不是我能掌握的。如果可以的话,我会的,否则,但这不取决于我。(我也没有个人带宽来修复它和任何其他nSize下游问题。)
幸运的是,杰克逊确实有这样的工具。
对于字段:
@JsonProperty("rules")
@JsonDeserialize(as = List.class, using = BadmapToListDeserializer.class)
private List<String> rules;
实际的反序列化程序:
public class BadmapToListDeserializer extends JsonDeserializer<List<String>> {
@Override
public List<String> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
List<String> valuesList = new ArrayList<>();
for (JsonToken jsonToken = jsonParser.nextToken(); jsonToken != JsonToken.END_OBJECT; jsonToken = jsonParser.nextToken()) {
if (jsonToken == JsonToken.VALUE_STRING) {
String value = jsonParser.getText();
valuesList.add(value);
}
}
return valuesList;
}
}