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

Java 非标准JSON的Spring自定义对象映射器,java,json,spring,Java,Json,Spring,我正在使用Spring的RestTemplate,访问restful Web服务并获取非标准JSON 我的意思是: { ... rules : { matched : "rule one", matched : "rule B", matched : "another rule" } ... } 所以基本上我需要这个哈希映射到一个列表。在我的pojo中,我希望字段如下所示: private List<Stri

我正在使用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
@JsonSerialize(using = MapValuesToListSerializer.class)
private List<String> rules;
私有列表规则;//解析后,应包含“规则一”,
//“规则B”、“另一规则”等
以下是我迄今为止所做的尝试。 这是我的序列化程序:

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);
    }
}
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;
    }
}
import com.fasterxml.jackson.core.JsonGenerator;
导入com.fasterxml.jackson.databind.JsonSerializer;
导入com.fasterxml.jackson.databind.SerializerProvider;

公共类MapValuesToListSerializer扩展了JsonSerializer,而我完全同意JsonSerializer
JB Nizet
的说法,“如果它是您自己的web服务,请修复它。”由于它的强大功能,这不是我所能理解的。如果可以的话我会的,否则的话,但那不是我的决定。(我也没有个人带宽解决此问题以及可能导致的任何其他nSize下游问题。)

幸运的是,杰克逊确实提供了这样做的工具

对于现场:

@JsonProperty("rules")
@JsonDeserialize(as = List.class, using = BadmapToListDeserializer.class)
private List<String> rules;
@JsonProperty(“规则”)
@JsonDeserialize(as=List.class,使用=BadmapToListDeserializer.class)
私人名单规则;
实际的反序列化程序:

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);
    }
}
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;
    }
}
公共类BadmapToListDeserializer扩展JsonDeserializer{
@凌驾
公共列表反序列化(JsonParser、JsonParser、反序列化上下文)引发IOException、JsonProcessingException{
列表值列表=新的ArrayList();
for(JsonToken-JsonToken=jsonParser.nextToken();JsonToken!=JsonToken.END_OBJECT;JsonToken=jsonParser.nextToken()){
if(jsonToken==jsonToken.VALUE\u字符串){
String value=jsonParser.getText();
价值列表。增加(价值);
}
}
返回值列表;
}
}

没有所谓的“非标准JSON”。要么是JSON,要么不是。这真的是你从网络服务中得到的吗?它根本不是JSON:标识符甚至都没有被引用。即使Jackson可以解析,我也看不出自定义序列化程序将如何帮助反序列化。作为替代方案,您有什么建议?我需要以这样或那样的方式转换这些数据,Jackson已经可以部分地读取这些数据,因此使用它作为起点似乎是一个合理的假设。我不会依赖一个本应返回JSON但不返回JSON的web服务。如果它是您自己的web服务之一,请修复它。如果不是,请要求web服务提供商修复WS以返回有效的JSON,或者提供能够解析其专有格式的解析器,或者至少提供该专有格式的规范。