使用@JsonProperty 序列化地图
Serializing map using @JsonProperty
我尝试使用 @JsonProperty
注释序列化一个包含 Map
的对象,但是当我测试它时,我发现只有映射的键被序列化。我查了一下,但没有找到解决方案,我做错了什么?
public class People {
private final Map<Long,String> idToNameMap;
public People(@JsonProperty("idToNameMap") final Map<Long,String> idToNameMap) {
this.idToNameMap = idToNameMap;
}
}
public class PeopleTest {
private static final long ID_1 = 111l;
private static final long ID_2 = 222l;
private static final String NAME_1 = "name1";
private static final String NAME_2 = "name2";
private final ObjectMapper mapper = new ObjectMapper();
@Test
public void testFromAndToJSON() throws Exception {
Map<Long,String> idToNameMap = Maps.newHashMap();
idToNameMap.put(ID_1,NAME_1);
idToNameMap.put(ID_2,NAME_2);
mapper.writeValueAsString(new People(idToNameMap));
}
}
您没有为 People
-class 提供任何序列化信息,仅提供反序列化信息。
以下应该适合您:
public class People {
private final Map<Long, String> idToNameMap;
// The constructor works for deserialization and has nothing to do with serialization
public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) {
this.idToNameMap = idToNameMap;
}
// Getters are typically automatically serialized
public Map<Long, String> getIdToNameMap() {
return idToNameMap;
}
}
有多种方法可以提供序列化信息。另一种方法是对方法使用 @JsonProperty
注释 - 例如:
@JsonProperty("idToNameMap")
public Map<Long, String> getMapping() {
return idToNameMap;
}
或者,另一种方法是将注释放在实际字段上。这不是我推荐的东西,因为它有点 magic.
public class People {
@JsonProperty("idToNameMap")
private final Map<Long, String> idToNameMap;
public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) {
this.idToNameMap = idToNameMap;
}
}
我个人比较喜欢:
- 注释放在方法上
- 对象是不可变的(如果可能的话)
- 并且添加了适当的
@JsonCreator
方法(构造函数适用于您的 class 但为了创建更复杂的对象结构 @JsonCreator
将帮助您)。 =33=]
我尝试使用 @JsonProperty
注释序列化一个包含 Map
的对象,但是当我测试它时,我发现只有映射的键被序列化。我查了一下,但没有找到解决方案,我做错了什么?
public class People {
private final Map<Long,String> idToNameMap;
public People(@JsonProperty("idToNameMap") final Map<Long,String> idToNameMap) {
this.idToNameMap = idToNameMap;
}
}
public class PeopleTest {
private static final long ID_1 = 111l;
private static final long ID_2 = 222l;
private static final String NAME_1 = "name1";
private static final String NAME_2 = "name2";
private final ObjectMapper mapper = new ObjectMapper();
@Test
public void testFromAndToJSON() throws Exception {
Map<Long,String> idToNameMap = Maps.newHashMap();
idToNameMap.put(ID_1,NAME_1);
idToNameMap.put(ID_2,NAME_2);
mapper.writeValueAsString(new People(idToNameMap));
}
}
您没有为 People
-class 提供任何序列化信息,仅提供反序列化信息。
以下应该适合您:
public class People {
private final Map<Long, String> idToNameMap;
// The constructor works for deserialization and has nothing to do with serialization
public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) {
this.idToNameMap = idToNameMap;
}
// Getters are typically automatically serialized
public Map<Long, String> getIdToNameMap() {
return idToNameMap;
}
}
有多种方法可以提供序列化信息。另一种方法是对方法使用 @JsonProperty
注释 - 例如:
@JsonProperty("idToNameMap")
public Map<Long, String> getMapping() {
return idToNameMap;
}
或者,另一种方法是将注释放在实际字段上。这不是我推荐的东西,因为它有点 magic.
public class People {
@JsonProperty("idToNameMap")
private final Map<Long, String> idToNameMap;
public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) {
this.idToNameMap = idToNameMap;
}
}
我个人比较喜欢:
- 注释放在方法上
- 对象是不可变的(如果可能的话)
- 并且添加了适当的
@JsonCreator
方法(构造函数适用于您的 class 但为了创建更复杂的对象结构@JsonCreator
将帮助您)。 =33=]