【发布时间】: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 的映射,其中映射的键是C 的name 属性。如果可能,我希望 JSON 看起来像这样:
{
"bList" : [
{
"attr":"itsValue"
"KEY_IN_MAP":"VALUE_IN_C",
"KEY_2_IN_MAP":"VALUE_2_IN_C"
}
]
}
其中KEY_IN_MAP 是C 的名称作为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<String,String> map而不是Map<String, C> map? -
将
Map<String,C> map改为List<C>怎么样? -
这行得通,但我有点想保留对象结构。这对 Json 可能没有意义,但对我的应用程序来说它很重要。
-
我认为您的 C 类和 B 类地图有点矛盾。如果您忽略 C 的名称,那么从 B 的映射中删除 C 本身并保持映射简单
. 可能是有意义的 -
我会试一试...要改变的太多了。你可以添加一个答案,我会接受的。