Java 在反序列化JSON时为类创建指定其他参数

Java 在反序列化JSON时为类创建指定其他参数,java,json,jackson,Java,Json,Jackson,Jackson有一个方便的功能,你可以。但是,我不确定最好的方法是向反序列化对象传递一个额外的构造函数参数。例如,我希望Jackson能够使用此JSON来构造和初始化以下类: { "x": "foo", "y": "bar", "z": "baz" } 但是Jackson没有一个简单的方法来插入它——我发现的大多数方法(或基于注释的选项)都使用静态工厂方法 答案不能使用全局/静态变量——我想基于每个配置对象配置配置对象 我的首选答案应该是: 简短一点!我知道有多种方

Jackson有一个方便的功能,你可以。但是,我不确定最好的方法是向反序列化对象传递一个额外的构造函数参数。例如,我希望Jackson能够使用此JSON来构造和初始化以下类:

{
    "x": "foo",
    "y": "bar",
    "z": "baz"
}

但是Jackson没有一个简单的方法来插入它——我发现的大多数方法(或基于注释的选项)都使用静态工厂方法

答案不能使用全局/静态变量——我想基于每个配置对象配置配置对象

我的首选答案应该是:

  • 简短一点!我知道有多种方法可以解决这个问题,我正在寻找最简单的方法
  • 继续利用Jackson对非构造函数属性使用反射和解释的能力,而不是编写每次添加或编辑可设置属性时都必须更新的反序列化程序
    • 不应要求我从JSON手动读取和缓冲对象属性(即,不要复制BeanDeserializer.\u反序列化UsingPropertyBased)
  • 合作

我已经探索过设置自定义或,但我还没有找到一种满足我的要求的方法。

目前没有这样的工具;“在反序列化过程中注入值的能力”(请参阅)会做到这一点吗?您可能想在Jackson用户(或开发人员)邮件列表上问这个问题,因为这是一个更高优先级的功能,有望为Jackson 1.9开发


一种可能是只使用@JsonCreator,用@JsonParameter修饰所有参数,然后从那里访问值——如果没有匹配的属性,您将得到null作为值。这不是最优的,但如果您可以访问所需的值(通过ThreadLocal,在调用反序列化之前填充),您至少可以解决这个问题。

谢谢您的回答。JACKSON-406并没有完全解决我所想的用例(尽管它本身很有用),但我还是决定采取不同的方法。我很确定这至少是可能的,但我最终得出结论,为了完成这项任务,我几乎必须复制大量无法接受的库代码。(我想我可以用CreatorContainer创建一个BeanDeserializer,该CreatorContainer返回一个调用非静态方法的自定义基于属性的构造函数,但当我发现工厂方法是静态反射调用的时,我放弃了。)ThreadLocal也是一个合理的建议——事实上,我在发布问题后自己就想到了。是的,非常好的侦探工作。:-)唉,我同意,如果不修改代码库代码,这个特定的功能很难实现。
public class Foo {
    /*
     * conf and x <b>must</b> be supplied at construction time
     */
    @JsonCreator
    public Foo(Configuration conf, @JsonValue("x") String x)

    public String getX();

    public String getY();
    public void setY(String y);
    public String getZ();
    public void setZ(String z);
}

public class SomeMainApplicationClass {
    public Foo loadFoo(InputStream in, Configuration conf) {
        ObjectMapper mapper = new ObjectMapper(/* ??? */);
        /* ??? */
        return mapper.readValue(in, Foo.class);
    }
}
public class FooFactory {
    private final Configuration conf;
    public FooFactory(Configuration conf) {
        this.conf = conf;
    }
    @JsonCreator
    public createFoo(@JsonProperty("x") String x) {
        return new Foo(conf, x);
    }
}