簡體   English   中英

用於非標准JSON的Spring自定義對象映射器

[英]Spring Custom Object Mapper for non-standard JSON

我正在使用Spring的RestTemplate來啟動一個寧靜的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所說的話,“如果它是您自己的Web服務之一,請對其進行修復。” 由於存在的力量,這不是我能掌握的。 如果可以的話我會的,否則,但這不取決於我。 (我也沒有個人帶寬來解決此問題,否則將導致任何其他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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM