gpt4 book ai didi

java - 如何让 Jackson mixin 处理包含的类型?

转载 作者:行者123 更新时间:2023-12-02 09:00:29 25 4
gpt4 key购买 nike

我使用 Jackson mixins 仅序列化特定字段。

我的 ObjectMapper 的配置如下:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setSerializationInclusion(Include.NON_NULL);
mapper.addMixIn(Person.class, SyncPerson.class);
mapper.addMixIn(TransactionLog.class, TransactionLogExport.class);

以下是与我要导出的 JSON mixin 对象配对的模型类:

// Model class
public class Person {
private Long id;
private String email;
private String firstName;
private String lastName;
}

// Desired JSON format. Excludes 'id' field
public interface SyncPerson {

@JsonProperty("firstName")
String getFirstName();

@JsonProperty("lastName")
String getLastName();

@JsonProperty("email")
String getEmail();
}


// Model class
public class TransactionLog {
private long id;
private Integer version;
private Person person;
private Date date;
private EntityAction action;
}

// Desired JSON format. Excludes 'id' field, 'version', 'date'
public interface TransactionLogExport {

@JsonProperty("id")
String getId();

@JsonProperty("person")
Person person();

@JsonProperty("action")
EntityAction getAction();
}

但是,我的测试显示 TransactionLog 的 person 属性未通过。

@Test
public void testWriteValue() throws Exception {
Person person = new Person();
person.setEmail("a@c.com");
person.setFirstName("A");
person.setLastName("C");

TransactionLog log = new TransactionLog();
log.setId(0L);
log.setAction(EntityAction.CREATE);
log.setPerson(person);
log.setStartValue("start");
log.setEndValue("end");
log.setChanges("change");

String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(log);
System.out.println(prettyJson);
// Prints:
// {
// "id" : 0,
// "action" : "CREATE",
}
}

如果我尝试使用常规 ObjectMapper mapper = new ObjectMapper(); 而不是 mixin 进行相同的测试,那么我会看到导出的完整对象,包括 Person电子邮件、姓名等。所以我配置 mixin 的方式一定有问题......否则我会误解一些东西。

那么任何人都可以帮助指示我可以做什么来导出我的 mixin 中的子类型“person”吗?

谢谢!

最佳答案

终于解决这个问题了。现在测试打印出我们想要的内容:

{
“id” : 0,
“person” : {
“email” : “a@c.com”,
“firstName” : “A”,
“lastName” : “C”
},
“action” : “CREATE”
}

错误发生在 TransactionLogExport 中。需要说明的是:

@JsonProperty("person")
Person getPerson();

而不是:

@JsonProperty("person")
Person person();

即该方法需要以“get”开头。

关于java - 如何让 Jackson mixin 处理包含的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60208385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com