处理注释 mixin 的杰克逊代码是否可以由第三方重用来混合非杰克逊注释?
处理混合蛋白的核心杰克逊类是什么?
您必须实现接口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批注的答案。 问题答案: 通常,您可以对您的类进行注释以应用过滤器: 您已指定不能在类上使用批注。
我环顾四周,不认为这是其中任何一个的复制品: 在《野蝇》中使用杰克逊注释 杰克逊注释被忽略 野蝇和杰克逊@JsonIgnore注释 使用野蝇10并部署具有以下类的战争: 如果构造函数未被注释,我会在部署时看到该构造函数中引发的异常,但在向 REST 服务发出请求时,我看不到 方法中的异常。 我在实体上有一个注释,它不起作用,我使用的注释也不起作用 该类如下所示(包括导入,以验证我使用的是 com.
问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要