【发布时间】:2019-08-13 05:19:04
【问题描述】:
我想优化在线发送的 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 是 lombok 注释,用于生成 getter 和 setter。
我尝试将 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "invoiceId") 注释添加到 Invoice 类,但这不会改变输出。
请注意,我希望这种带有 Invoice 的序列化仅在它作为子项传递给容器模型时发生。如果我想独立发送发票,它将序列化发票模型中的所有字段。我相信这是实现 RESTful WS 时的常见场景。
我需要为此编写客户序列化程序吗?
【问题讨论】:
-
您可以使用@JsonIgnore 来忽略属性
-
其实只是一个小例子。如果类结构很大,我可能需要在许多字段上注释 @JsonIgnore。
标签: java json jackson jackson2