【发布时间】:2018-04-17 11:35:08
【问题描述】:
我有一个包含 500k 个对象的 json 文件,这是它的格式:
"WORKORDER": [
{
"Attributes": {
"SITEID": {
"content": "BEDFORD"
},
"WONUM": {
"content": "1000"
},
"WOPRIORITY": {
"content": 2
},
"WORKTYPE": {
"content": "CM"
}
}
},
{
"Attributes": {
"SITEID": {
"content": "BEDFORD"
},
"WONUM": {
"content": "1000-10"
},
"WORKTYPE": {
"content": "CM"
}
}
}
我得到这样的不同值:
for (int i = 0; i < WORKORDER.length(); i++) {
JSONObject obj = WORKORDER.getJSONObject(i);
JSONObject att = obj.getJSONObject("Attributes");
if( att.has(col)){ // getting col from params in the servlet
JSONObject column = att.getJSONObject(col);
Object colval = column.get("content");
if(!(list.contains(colval))) {
out.println( colval);
list.add(colval);
}
但仅 5000 个对象需要很长时间!
有没有办法在不解析整个 Json 文件的情况下获取任何列的不同值,否则只解析所需的列。
【问题讨论】:
-
您可以使用
Set代替List。 (如果list代表List)。那将是一个“更简单”的代码。现在直接过滤 JSON...除非您可以更改 JSON 生成,否则您仍然需要读取 JSON(JSONObject只是一个解析器)。 -
你可以尝试转换成csv,然后获取需要的列
-
@AxelH 使用集合时会加速解析吗???
-
@PankajSinghal 但转换为 csv 也比获取数据需要时间!!
-
是和不是。这取决于您采取的实施方式。使用
HashSet可以做到这一点,因为它使用存储桶。目前,这是杀死你的contains方法,它需要为 JSON 的每个元素迭代列表。一开始没问题,但是当你已经有 1000 个项目时,这些项目将被迭代 40 万次以上。