用于非标准JSON的Spring Custom Object Mapper

时间:2016-04-08 22:00:48

标签: java json spring

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

这不起作用。标准字段都正确序列化,但不符合此字段的非标准字段。我错过了一个重要的部分,但我不知道是什么。

1 个答案:

答案 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;
    }
}