用于非标准JSON的Spring自定义对象映射器



我正在使用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;
    }
}

最新更新