繁体   English   中英

使用@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;
}

或者,另一种方法是将注释放在实际字段上。 这不是我推荐的,因为它有些神奇

public class People {
    @JsonProperty("idToNameMap")
    private final Map<Long, String> idToNameMap;

    public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) {
        this.idToNameMap = idToNameMap;
    }
}

我个人更喜欢:

  • 注释放在方法上
  • 对象是不可变的(如果可能的话)
  • 并且添加了适当的@JsonCreator -method(构造函数适用于您的类,但为了创建更复杂的对象结构, @JsonCreator将帮助您)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM