【问题标题】:Marshaling list of objects containing maps of objects to JSON包含对象到 JSON 的映射的对象的编组列表
【发布时间】:2013-01-14 14:51:18
【问题描述】:

我有这个对象结构,我试图用 Jackson 注释它以编组/解组到 JSON 文件。

public class A {
    List<B> bList;
}

public class B {
    String attr;
    Map<String, C> map;
}

public class C {
    @JsonIgnore
    String name;
    String value;
}

A 有一个B 的列表,B 有一个C 的映射,其中映射的键是Cname 属性。如果可能,我希望 JSON 看起来像这样:

{
    "bList" : [
               {
                   "attr":"itsValue"
                   "KEY_IN_MAP":"VALUE_IN_C",
                   "KEY_2_IN_MAP":"VALUE_2_IN_C"
               }
               ]
}

其中KEY_IN_MAPC 的名称作为B 的映射中的键,VALUE_IN_C 是映射中值对象的值。我尝试为地图注解 put 方法:

@JsonAnySetter
private void put(String name, C value) {
    map.put(name, c);
}

但是编组这给了我:

{
    "bList" : [
               {
                   "attr":"itsValue"
                   "KEY_IN_MAP": {
                       "value":"VALUE_IN_C",
                   },
                   "KEY_2_IN_MAP": {
                       "value":"VALUE_2_IN_C"
                   }
               }
               ]
}

有什么方法可以使用 Jackson 或任何其他 JSON 序列化库获取上述映射?我的目标是摆脱每次写"value"的冗余,尽可能压缩文件。

B 中的地图可以变成C 的列表,但我仍然需要映射

{"name" : "value"} for each object C

【问题讨论】:

  • 为什么不使用Map&lt;String,String&gt; map 而不是Map&lt;String, C&gt; map
  • Map&lt;String,C&gt; map 改为List&lt;C&gt; 怎么样?
  • 这行得通,但我有点想保留对象结构。这对 Json 可能没有意义,但对我的应用程序来说它很重要。
  • 我认为您的 C 类和 B 类地图有点矛盾。如果您忽略 C 的名称,那么从 B 的映射中删除 C 本身并保持映射简单 . 可能是有意义的
  • 我会试一试...要改变的太多了。你可以添加一个答案,我会接受的。

标签: java json jackson


【解决方案1】:

以下是我的一些建议:

  1. 将您的Map&lt;String,C&gt; 设为Map&lt;String,String&gt;
  2. 您也可以将Map&lt;String,C&gt; 设为List&lt;C&gt;

请查看讨论相同内容的other 线程。

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2021-05-18
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多