有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用@JsonProperty实现java序列化映射

我尝试使用@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));
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您没有为People-类提供任何序列化信息,只有反序列化信息

    以下内容应该适合您:

    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方法(构造函数可以为类工作,但为了创建更复杂的对象结构@JsonCreator将对您有所帮助)