【发布时间】:2020-09-14 19:03:15
【问题描述】:
假设我有从以下形式的源中提取的 JSON 数据:
{
"fileName" : "C:\\Users\\jgagnon\\sample_data\\PDM_BOM.xlsx",
"sheets" : [ {
"name" : "PDM_BOM",
"data" : [ [ "BRANCH", "PARENT ITEM NUMBER", "2ND ITEM NUMBER", "QUANTITY REQUIRED", "UNIT OF MEASURE", "ISSUE TYPE CODE", "LINE TYPE", "STOCK TYPE", "TYPE BOM", "LINE NUMBER", "OPERATING SEQUENCE", "EFFECTIVE FROM DATE", "EFFECTIVE THRU DATE", "DRAWING NUMBER", "UNIT COST", "SCRAP PERCENT" ],
[ "B20", "208E8840040", "5P884LPFSR2", 0.32031, "LB", "I", "S", "M", "M", 1.0, 10.0, "09/11/13", "12/31/40", null, 0.0, 0.0 ],
[ "B20", "208E8840168", "5P884LPFSR2", 1.36, "LB", "I", "S", "M", "M", 1.0, 10.0, "02/26/08", "12/31/40", null, 0.0, 0.0 ],
[ "B20", "208E8840172", "5P884LPFSR2", 1.3924, "LB", "I", "S", "M", "M", 1.0, 10.0, "02/26/08", "12/31/40", null, 0.0, 0.0 ],
[ "B20", "208E8840180", "5P884LPFSR2", 1.4565, "LB", "I", "S", "P", "M", 1.0, 10.0, "03/04/09", "12/31/40", null, 0.0, 0.0 ],
[ "B20", "21PPH150166", "8P315TPMRG", 1.39629, "LB", "I", "S", "M", "M", 1.0, 10.0, "03/05/18", "12/31/40", null, 0.0, 0.0 ] ],
"maxCols" : 16,
"maxRows" : 14996
} ]
}
我关心的信息在data 元素中,它是一个数组数组,表示工作表中的行。第一行包含列标题。
现在,假设我有一个 Java 类,BOM.java,如下所示:
public class BOM {
private String branch;
private String parentItemNumber;
private String secondItemNumber;
private double quantityRequired;
private String unitOfMeasure;
private String issueTypeCode;
private String lineType;
private String stockType;
private String typeBom;
private double lineNumber;
private double operatingSequence;
private String effectiveFromDate;
private String effectiveThruDate;
private String drawingNumber;
private double unitCost;
private double scrapPercent;
// getters/setters omitted
}
有没有办法解析这个导致java.util.List 的BOM 对象的JSON 数据?
我至少假设我需要在上面的类中添加一些 Jackson“JSON”注释来帮助 Jackson 进行字段映射?
到目前为止,我已经使用 Jackson ObjectMapper.readTree(File) 方法来提取数据。这提供了一个 JsonNode 层次结构,我可以导航到项目。
我发现了一些关于使用 Jackson TypeFactory 或 TypeReference 的建议,但我不明白它们是如何工作的,也无法让它们为我工作。
这是我目前正在使用的简单程序:
import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONObjectReader {
public static void main(String[] args)
throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(new File("PDM_BOM.json"));
JsonNode sheets = root.get("sheets");
JsonNode sheet1 = sheets.get(0);
JsonNode dataNode = sheet1.get("data");
// skip first row
for (int i = 1; i < dataNode.size(); i++) {
JsonNode n = dataNode.get(i);
System.out.println(n);
}
}
}
【问题讨论】:
-
如果你有 Sheet 和 Book (e.g) 类,你可以使用 mapper.readValue(json, Book.class);