java - Jackson - 仅序列化 Java Pojo 的列表属性中的对象 ID
问题描述
我想优化要在线发送的 json 数据。我的代码中有三个模型。这些是客户、发票和特定信息。
客户类
@Data
public class Customer implements Serializable {
private long customerId;
private String name;
private String taxId;
private String phone;
private String address;
private String emailId;
private Date created;
private List<Invoice> invoices;
}
发票类
@Data
public class Invoice implements Serializable {
private String invoiceId;
private List<Particular> particulars;
private Date invoiceDate;
}
特殊类
@Data
public class Particular {
private String item;
private int quantity;
private float tax;
private int unitPrice;
}
我的测试代码:
@Test
public void makeCustomerJsonWithInvoices() throws JsonProcessingException {
Customer customer = new Customer();
customer.setCustomerId(1234);
customer.setName("Pawan");
customer.setPhone("+918989898989");
customer.setEmailId("something@something.com");
customer.setAddress("Mumbai, India");
customer.setTaxId("MQZ11DPS");
customer.setCreated(new Date());
Invoice invoice1 = new Invoice();
invoice1.setInvoiceId("A-1");
Particular particular1 = new Particular("abc", 1, 0, 12);
Particular particular2 = new Particular("xyz", 2, 0, 20);
invoice1.setInvoiceDate(new Date());
invoice1.setParticulars(Arrays.asList(particular1, particular2));
Particular particular3 = new Particular("mno", 2, 0, 15);
Invoice invoice2 = new Invoice();
invoice2.setInvoiceId("A-2");
invoice2.setParticulars(Arrays.asList(particular3));
invoice2.setInvoiceDate(new Date());
customer.setInvoices(Arrays.asList(invoice1, invoice2));
String value = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(customer);
System.out.println(value);
}
我在这里想要的是通过序列化 Invoice 来避免冗余,以便生成的 json 紧凑。这应该通过仅发送 invoiceId 属性值而不是整个 Invoice 对象 json 来实现。
测试代码打印的内容:
{
"customerId" : 1234,
"name" : "Pawan",
"taxId" : "MQZ11DPS",
"phone" : "+918989898989",
"address" : "Mumbai, India",
"emailId" : "something@something.com",
"created" : 1553243962038,
"invoices" : [ {
"invoiceId" : "A-1",
"particulars" : [ {
"item" : "abc",
"quantity" : 1,
"tax" : 0.0,
"unitPrice" : 12
}, {
"item" : "xyz",
"quantity" : 2,
"tax" : 0.0,
"unitPrice" : 20
} ],
"invoiceDate" : 1553243962038
}, {
"invoiceId" : "A-2",
"particulars" : [ {
"item" : "mno",
"quantity" : 2,
"tax" : 0.0,
"unitPrice" : 15
} ],
"invoiceDate" : 1553243962039
} ]
}
我想要它打印的内容:
{
"customerId" : 1234,
"name" : "Pawan",
"taxId" : "MQZ11DPS",
"phone" : "+918989898989",
"address" : "Mumbai, India",
"emailId" : "something@something.com",
"created" : 1553243962038,
"invoices" : [ {
"invoiceId" : "A-1"
}, {
"invoiceId" : "A-2"
} ]
}
@Data
是用于生成 getter 和 setter的lombok注释。
我试图向@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "invoiceId")
Invoice 类添加注释,但这不会改变输出。
请注意,我希望这种带有 Invoice 的序列化仅在它作为子项传递给容器模型时发生。如果我想独立发送 Invoice,它将序列化 Invoice 模型中的所有字段。我相信这是实现 RESTful WS 时的常见场景。
我需要为此编写客户序列化程序吗?
解决方案
我可以通过以下方式修改 Customer 类来实现这一点。
@Data
public class Customer implements Serializable {
private long customerId;
private String name;
private String taxId;
private String phone;
private String address;
private String emailId;
private Date created;
@JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="invoiceId")
@JsonIdentityReference(alwaysAsId=true)
private List<Invoice> invoices;
}
答案的灵感来自https://stackoverflow.com/a/17583175/1365340
有了这个,我可以生成Customer
带有发票 ID 列表的 json。Invoice
单独序列化的对象从 json 中的所有字段中获取所有值。
推荐阅读
- visual-studio-code - 在 vscode 中,您如何判断 TextDocumentContentProvider 提供的文档是否显示或显示在何处
- ace-editor - 无法配置片段
- android - showSoftInputFromInputMethod 已弃用 Android P API 28
- dart - 颤振:输入'列表
' 不是类型 'String' 的子类型 - ruby-on-rails - Controller#edit 中的 TypeError 无法将 PG::Result 转换为字符串
- bash - 如何写入支持tail -f的文件
- python - 用于json链接的Django queryset反向外键
- java - 如何通过注解处理工具获取扩展接口?
- android - 在 Android 导航组件中使用 navigateUp 传递数据/捆绑
- php - 如何在php中交错复制一个数组?