java - jersey 2.6 jackson 2.3 和 map 中的复杂键

标签 java json rest servlets jackson

我有一个包含 id 的简单对象。我正在寻找一种将其用作 HashMap 中的键的方法。

Jersey 在我的 web.xml 中注册为 servlet

<servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>org.ambientlight.RestConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

jackson 在这里注册。

public class RestConfig extends ResourceConfig {

    public RestConfig() {
        packages("org.ambientlight.webservice");
        register(JacksonFeatures.class);
    }
}

这是我的关键对象:

@JsonSerialize(using = SwitchableIdSerializer.class)
public class SwitchableId {

    public String id;

    public SwitchType type;


    public SwitchableId(String id, SwitchType type) {
        super();
        this.id = id;
        this.type = type;
    }
}

这是我的序列化器

public class SwitchableIdSerializer extends JsonSerializer<SwitchableId> {

    @Override
    public void serialize(SwitchableId data, JsonGenerator json, SerializerProvider provider) throws IOException,
    JsonGenerationException {
        json.writeString(data.id + "|" + data.type);
    }
}

如果我直接返回 SwitchableId,一切都会像预期的那样工作。但如果我返回带有 hasmap 的结构,则不会使用序列化器,而仅应用简单的 SwitchableId.toString() 。

这样的例子有很多。对于旧版本或 Jackson 独立使用。但我找不到任何关于如何在 Jersey servlet 中处理的提示。请帮忙!

我尝试注释包含的类:

public class PowerstateHandlerConfiguration extends AbstractActionHandlerConfiguration {

    @JsonSerialize(keyUsing = SwitchableIdSerializer.class)
    public Map<SwitchableId, Boolean> powerStateConfiguration = new HashMap<SwitchableId, Boolean>();
}

但没有成功。缺少什么?

最佳答案

用于Map键的序列化器(和反序列化器)与常规值(反)序列化器不同,因此要使用的注释是:

class MapBean {
  @JsonSerialize(keyUsing=SwitchableIdSerializer.class)
  public Map<SwitchableId, String> values;
}

原因是 @JsonGenerator 使用的 write 方法不同(writeFieldName() 而不是 writeString())。 如果使用注释,您需要在相关的 Map 属性上使用它。或者,您可以使用 SimpleModule 注册 key 序列化器;但为此,您需要访问 Jersey 使用的 ObjectMapper (这是一个应该通过谷歌搜索找到答案的问题)。

关于java - jersey 2.6 jackson 2.3 和 map 中的复杂键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22174560/

相关文章:

java - 如何从kotlin中的列表中删除一些元素

json - Spring boot Embedded Tomcat "application/json"post请求限制为10KB

json - 通过 API 访问公开共享的 OneDrive 文件夹

java - 我应该如何构建 jsps 使用的资源包属性文件?

java - 用换行符分割 Java 字符串

java - Volley 请求队列返回 null

php - Laravel 获取相关模型的相关模型

java - 为什么 Spring Boot 2.0 应用程序不运行 schema.sql?

javascript - 使用 jquery 自动完成,我如何测试解析函数中的当前对象?

json - 针对包含多个模式定义的 JSON 模式进行验证