我正在使用Spring的RestTemplate,以获得一个宁静的Web服务并获得非标准的JSON。
这就是我的意思:
{
...
rules : {
matched : "rule one",
matched : "rule B",
matched : "another rule"
}
...
}
所以基本上我需要将这个Hash映射到列表。在我的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;
这不起作用。标准字段都正确序列化,但不符合此字段的非标准字段。我错过了一个重要的部分,但我不知道是什么。
答案 0 :(得分:0)
虽然我完全赞同JB Nizet
,但是如果它是您自己的网络服务之一,请修复它。&#34;由于权力的存在,这不是我掌握的东西。如果可以,我会这样做,否则,但这不是由我决定的。 (我也没有个人带宽修复此问题以及任何其他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;
}
}