【问题标题】:Is it possible to serialize/deserialize JSON to Java DTO with extra fields going into a map?是否可以将 JSON 序列化/反序列化为 Java DTO,并在地图中添加额外的字段?
【发布时间】:2013-06-03 19:23:49
【问题描述】:

我有一个这样的 DTO:

public Foo {
    public int bar = 123;
    public Map<String, Object> params; // key1=v1, key2=v2 etc.
}

我希望它序列化到/从以下 JSON:

{
    "bar": 123,
    "key1": "v1",
    "key2": "v2"
} 

有谁知道如何使用 Jackson 或 Genson 做到这一点?基本上,我希望对 DTO 中声明的字段进行自动类型转换,但任何“额外”都可以进入 params 映射。

【问题讨论】:

  • 使用 Jackson 的流 API 和 Foo 的构建器类,是的,这是可能的。我相信杰克逊甚至有可能将“其余”未映射的成员吞入Map&lt;String, Object&gt;,但我从未使用过...
  • 你也可以试试gson(但它适用于draft3版本)
  • @David:我很好奇你的用例需要那种 JSON 结构。如果params 有一个名为bar 的密钥呢?
  • 它是 API 的一部分,支持 JSON 正文或表单数据的 POST。因此,如果 JSON 是扁平的并且相关端点需要能够接受额外的东西,它会很有帮助。是的,如果将来添加与 params 中现有键匹配的字段,则可能会出现问题。
  • 你试过使用反射吗?

标签: java json jackson genson


【解决方案1】:

感谢@fge 让我走上正轨。 Jackson 有 @JsonAnySetter 和 @JsonAnyGetter 注释,可用于执行此操作:

public Foo {
    public int bar;
    private transient Map<String, Object> params = new HashMap<String, Object>();

    @JsonAnySetter
    public void set(String k, Object v) { params.put(k, v); }

    @JsonAnyGetter
    public Map getParams() { return params; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多