当前位置: 首页 > 知识库问答 >
问题:

杰克逊注释混合框架

云欣嘉
2023-03-14

处理注释 mixin 的杰克逊代码是否可以由第三方重用来混合非杰克逊注释?

处理混合蛋白的核心杰克逊类是什么?

共有1个答案

苏法
2023-03-14

您必须实现接口com.fasterxml.jackson.databind.ser.ContextualSerializer和/或com.fasterxml.jackson.databind.deser.ContextualDeserializer。Jackson序列化和反序列化JSON。如果这不是您的意图,您将获得一些开销,另一种方法可能更好(例如,使用AeyJ的解决方案)。

如果您对 Jackson 的实现以及如何使用(反)序列化程序感兴趣:

该项目包含Jackson数据处理器的通用数据绑定功能和树模型。它建立在核心流解析器/生成器包之上,并使用Jackson Annoations进行配置。

一个很好的分析入口:ObjectMapper

此代码演示了自定义注释(在 mixin 中使用)的使用以及如何实现合适的(反)序列化程序:

public class MyBean {

    private String value;
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

/////

import com.fasterxml.jackson.annotation.JacksonAnnotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation // important so that it will get included!
public @interface MyAnnotation {
    public String value();
}

/////

public abstract class MyMixin {

    @MyAnnotation("Hello")
    public abstract String getValue();
}

/////

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.deser.std.StringDeserializer;

import java.io.IOException;

public class MyDeserializer extends JsonDeserializer<String>  implements ContextualDeserializer {

    private String annoValue;

    public MyDeserializer(){}
    public MyDeserializer(MyAnnotation ann) {
        annoValue = ann.value();
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String serializedValue = p.getText();
        return serializedValue.substring(annoValue.length() + 1, serializedValue.length() - 1);
    }

    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty prop) throws JsonMappingException {

        MyAnnotation ann = prop.getAnnotation(MyAnnotation.class);
        if (ann == null) {
            ann = prop.getContextAnnotation(MyAnnotation.class);
        }
        if (ann == null) {
            return new StringDeserializer();
        }
        return new MyDeserializer(ann);
    }

}

/////

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.fasterxml.jackson.databind.ser.std.StringSerializer;

import java.io.IOException;

public class MySerializer extends JsonSerializer<String> implements ContextualSerializer {

    private String annoValue;

    public MySerializer() {}
    public MySerializer(MyAnnotation ann) {
        annoValue = ann.value();
    }

    @Override
    public void serialize(String toSerialize, JsonGenerator gen, SerializerProvider prov) throws IOException {
        gen.writeString(annoValue + " " + toSerialize + "!");
    }

    public JsonSerializer createContextual(SerializerProvider prov, BeanProperty prop) throws JsonMappingException {

        MyAnnotation ann = prop.getAnnotation(MyAnnotation.class);
        if (ann == null) {
            ann = prop.getContextAnnotation(MyAnnotation.class);
        }
        if (ann == null) {
            return new StringSerializer();
        }
        return new MySerializer(ann);

    }
}

/////

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(String.class, new MySerializer());
        module.addDeserializer(String.class, new MyDeserializer());
        mapper.registerModule(module);
        mapper.addMixIn(MyBean.class, MyMixin.class);
        MyBean bean = new MyBean();
        bean.setValue("World");
        String jsonInString = mapper.writeValueAsString(bean);
        System.out.println(jsonInString);
        MyBean deserialized = mapper.readValue(jsonInString, MyBean.class);
        System.out.println(deserialized.getValue());
    }
}
 类似资料:
  • 我在一个jaxb注释类中有一个方法,当且仅当它使用jersey 1.16编组到JSON时,我想编组一个值,它在下面使用jackson 1.9。我希望使用jaxb的@XmlTransient和jackson的@JsonProperty以这样的方式完成这项工作: …但马歇尔似乎一点也不觉得。没有遇到错误。

  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 问题内容: 创建类的首选方法是 一成不变的 可以使用Jackson进行序列化/反序列化 易于阅读且样本量低 最好是,我希望这样的工作: 然后将所有字段都设为。但是,它甚至不编译(我不确定为什么)。使用 将编译但仅产生 问题答案: 添加 ConstructorProperties : 用以下行在适当的位置创建文件: 向您的班级添加lombok 批注以使其不可变 然后,Jackson的序列化和反序列化

  • 问题内容: 我试图通过使用以下(简化)代码从序列化中筛选出某些字段: 我们使用的我一直期望创建的序列化Json字符串仅包含,但是我得到了。 如何创建一个尊重指定过滤器的临时编写器(在我的情况下,无法重新配置ObjectMapper)。 注意:由于我的应用程序中的使用场景,我只能接受不使用Jackson批注的答案。 问题答案: 通常,您可以对您的类进行注释以应用过滤器: 您已指定不能在类上使用批注。

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A