【问题标题】:Android : Jackson with ActiveAndroidAndroid : 杰克逊与 ActiveAndroid
【发布时间】:2011-06-06 19:30:25
【问题描述】:

ActiveAndroid 有一个约束,即它的所有实体都需要从某个基类继承,并且需要有一个以 Context(来自活动)作为输入的单参数构造函数。 [不喜欢这个约束]。

使用 gson,我可以创建一个类型适配器来绕过这个限制。

public class PolicyInstanceCreator implements InstanceCreator<Policy>{
    private Context context;

    public PolicyInstanceCreator(Context context) {
        this.context = context;
    }

    @Override
    public Policy createInstance(Type type) {
        return new Policy(context);
    }
}

Gson gson = new GsonBuilder().registerTypeAdapter(Policy.class, new PolicyInstanceCreator(context)).create();
Policy[] policies = gson.fromJson(myString, Policy[].class);

一种可能性似乎是我们需要使用 Jackson 实现自定义解串器。

除了必须为杰克逊编写自定义反序列化器之外,还有其他选择吗?或者这是我唯一使用特定参数构造函数的选择吗?

如果有其他选择,请告诉我。

谢谢

【问题讨论】:

    标签: android json gson jackson activeandroid


    【解决方案1】:

    另一种方法是应用混合注释(请参阅此 wikithis blog post)添加 @JsonCreator 以指定要使用此特定构造函数。 这要求“上下文”来自 JSON(JSON 中的名称可以在构造函数参数上使用 @JsonProperty 指定);或者可以传入 null (如果从 JSON 中找不到此类字段,则会发生这种情况)。 如果需要传递实际的外部上下文对象,则可以使用自定义反序列化器(直到实现“外部值注入”;这是计划中的,但尚未添加)。

    【讨论】:

    • 上下文是活动本身。我对java不太熟悉,但是看帖子我不确定Active Android想要什么。我真的不喜欢 ActiveAndroi 强加的继承,这是这个问题的根源。可能必须关闭 ORM。与杰克逊相比,gson 慢得多,因此选择,否则 gson 有一个优雅的解决方案来处理实例化。
    • 是的,类的设计肯定是错误的老式的有点错误的方式。 :-) ...关于实例化,也许杰克逊确实需要一种注册实例化器的方法;如果通常需要,添加它应该是微不足道的。
    • 那太好了。你参与了这个项目吗?
    • 是的,我是 Jackson 开发人员(邮件列表中的 cowtowncoder)
    • 嗯,你有什么想法,你能尽快添加这个吗?这将使实体的 json 到数据库的转换不那么痛苦,我们可以继续使用 jackson。在处理像 ActiveAndroid 这样强加继承的东西时,InstanceCreator 将是一个很棒的功能。
    猜你喜欢
    • 2011-08-25
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多