如何使用 Jackson 在 JSON 反序列化期间添加常量*
How to add a constant* during JSON deserialization using Jackson
我正在使用 Jackson 和 JsonDeserializer。
当我反序列化为MyClass时,需要设置MyContextclass。
我曾经使用静态最终常量,但出于我的原因我不能使用它(我需要使用实例常量)。
我正在使用 ObjectMapper 进行反序列化。
这是我试过的代码。
@JsonDeserialize(using=MyClassDeserializer.class)
class MyClass {
@JsonIgnore
private final MyContext context;
public final int foo;
public final String bar;
}
class MyClassDeserializer extends JsonDeserializer<MyClass> {
@Override
public PacketContainer deserialize(JsonParser parser, DeserializationContext context)
throws IOException {
MyContext myContext = (MyContext) deserializationContext.getConfig().getAttributes().getAttribute("context");
// It seems no attributes has registered.
doSome(myContext.foo); // NullPointerException occurs
// ...
}
}
class MyContext {
private String foo;
private int bar;
// getter(); setter();
}
// main()
ObjectMapper mapper = new ObjectMapper();
Context context = new Context();
context.setFoo("foo");
context.setBar(0);
HashMap<String, Context> contextSetting = new HashMap<>();
contextSetting.put("context", context);
mapper.getDeserializationConfig().getAttributes().withSharedAttributes(contextSetting);
mapper.getDeserializationContext().setAttribute("context", context);
如何在反序列化期间动态设置常量?
我正在使用翻译器。
谢谢。
问题在于您试图以错误的方式在 mapper
的配置中注册 context
对象:您可以使用 DeserializationConfig
withAttribute 方法 returns 一个新的配置,包括你的 context
对象,然后用新的配置设置你的映射器:
MyContext myContext = new MyContext();
myContext.setFoo("foo");
myContext.setBar(0);
ObjectMapper mapper = new ObjectMapper();
mapper.setConfig(mapper.getDeserializationConfig()
.withAttribute("context", myContext));
之后 context
对象在您的 JsonDeserializer
class 中可用,就像您写的那样:
MyContext myContext = (MyContext) deserializationContext.getConfig()
.getAttributes()
.getAttribute("context");
我正在使用 Jackson 和 JsonDeserializer。 当我反序列化为MyClass时,需要设置MyContextclass。 我曾经使用静态最终常量,但出于我的原因我不能使用它(我需要使用实例常量)。 我正在使用 ObjectMapper 进行反序列化。
这是我试过的代码。
@JsonDeserialize(using=MyClassDeserializer.class)
class MyClass {
@JsonIgnore
private final MyContext context;
public final int foo;
public final String bar;
}
class MyClassDeserializer extends JsonDeserializer<MyClass> {
@Override
public PacketContainer deserialize(JsonParser parser, DeserializationContext context)
throws IOException {
MyContext myContext = (MyContext) deserializationContext.getConfig().getAttributes().getAttribute("context");
// It seems no attributes has registered.
doSome(myContext.foo); // NullPointerException occurs
// ...
}
}
class MyContext {
private String foo;
private int bar;
// getter(); setter();
}
// main()
ObjectMapper mapper = new ObjectMapper();
Context context = new Context();
context.setFoo("foo");
context.setBar(0);
HashMap<String, Context> contextSetting = new HashMap<>();
contextSetting.put("context", context);
mapper.getDeserializationConfig().getAttributes().withSharedAttributes(contextSetting);
mapper.getDeserializationContext().setAttribute("context", context);
如何在反序列化期间动态设置常量?
我正在使用翻译器。 谢谢。
问题在于您试图以错误的方式在 mapper
的配置中注册 context
对象:您可以使用 DeserializationConfig
withAttribute 方法 returns 一个新的配置,包括你的 context
对象,然后用新的配置设置你的映射器:
MyContext myContext = new MyContext();
myContext.setFoo("foo");
myContext.setBar(0);
ObjectMapper mapper = new ObjectMapper();
mapper.setConfig(mapper.getDeserializationConfig()
.withAttribute("context", myContext));
之后 context
对象在您的 JsonDeserializer
class 中可用,就像您写的那样:
MyContext myContext = (MyContext) deserializationContext.getConfig()
.getAttributes()
.getAttribute("context");