jackson 使用ObjectMapper将字符串转换为对象,但忽略具有@JsonIgnore属性字段

o2g1uqev  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(309)

使用者类别:

@Data
class User {
    @JsonIgnore
    private int id;
    private String name;
}

我有这样一个场景,我必须将用户对象写为字符串,但我不希望在其中包含'id'字段,为此我使用了@JsonIgnore属性。我使用objectMapper将值写为字符串:

String s = mapper.writer().withDefaultPrettyPrinter().writeValueAsString(user);

这将按预期创建字符串值(不包括ID字段)。
但在下一步,我需要String s中的对象(但它不应该有id字段-但当我尝试使用readValue执行此操作时,我会在对象中获得具有默认值的id字段-这是我不想要的。)

User value = mapper.readValue(s, User.class);

下面是完整的代码:

@Data
class User {
    @JsonIgnore
    private int id;
    private String name;
}

public class Test {
    ObjectMapper objMapper;

    public static void main(String[] args) throws IOException {
        Test t = new Test();
        t.meth();
    }

    public void meth() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User();
        user.setId(2);
        user.setName("Bob");
        System.out.println(user);
        String s = mapper.writer().withDefaultPrettyPrinter().writeValueAsString(user);
        User value = mapper.readValue(s, User.class);
        System.out.println("==>String Value:\n" + s);
        System.out.println("===>Object Value:\n" + value);
    }
}

我得到的输出:

==>String Value:
{
  "name" : "Bob"
}
===>Object Value:
User(id=0, name=Bob)

预期输出:

==>String Value:
{
  "name" : "Bob"
}
===>Object Value:
User(name=Bob)

请查看实际和预期输出中的对象值。
期待一个简单的解决方案。
先谢谢你。

jgovgodb

jgovgodb1#

int不能是null,因为它是基本数据类型。您可以使用Integer,因为它是对象,因此可以是null
我认为您仍然需要告诉json,它可以忽略那些不在json中的字段,并使用@JsonIgnoreProperties(ignoreUnknown = true)
如果您的目标是在打印用户时只获取不带id的输出,则可以覆盖toString方法:

@Override
public String toString() {
    return "User(name=" + name + ")";
}

或者,由于您使用了包含ToString注解的Data注解,因此可以在id字段上添加@ToString.Exclude

相关问题