从 Web 服务解析分页 json
parsing paginated json from web service
我正在尝试解析从远程 Web 服务生成的大量 JSON 数据。生成的输出跨 500 个 URI 分页,每个 URI 包含 100 JSON 个对象。我需要在每个 JSON 对象中匹配一个 属性,它是 DOI(数字对象标识符),与从本地数据库获取的相应字段相匹配,然后更新记录。
我遇到的问题是控制我的循环结构以寻找匹配的 JSON DOI,同时确保所有数据都已被解析。
如您所见,我尝试使用 break 和 continue 语句的组合,但我无法 'move' 超出第一个 URI。
我后来引入了一个标志变量来帮助控制循环无效。
while($obj = $result->fetch_object()){
for($i=1;$i<=$outputs_json['meta']['response']['total-pages'];$i++){
$url = 'xxxxxxxxxxxxxxx&page%5Bnumber%5D='."$i".'&page%5Bsize%5D=100';
if($outputs = json_decode(file_get_contents($url),true)===false){
}
else{
try{
$outputs = json_decode(file_get_contents($url),true);
$j=0;
do{
$flag = false;
$doi = trim($outputs['data'][$j]['attributes']['identifiers']['dois'][0], '"');
if(!utf8_encode($obj->doi)===$doi) continue;
}else{
$flag = true;
$j++;
}
}while($j!==101);
if($flag===true) break;
} catch(Exception $e) {
}
}
}
}
}
什么是保证解析所有 URI 中的每个 JSON 对象并且仅当获取记录的 DOI 字段与传入 JSON 的 DOI 属性 匹配时才在我的数据库上执行 CRUD 操作的最佳方法] 数据?
我不是 100% 确定我理解你问题的每个方面,但对我来说改变执行顺序是有意义的
- 从外部服务获取页面
- 解码 json 并遍历所有 100 个对象
- 获得一个 DOI
- 从数据库中获取相应的记录
- 更改数据库记录
- 当所有 json 对象都已完成时 - 获取下一个 url
- 重复直到获取所有 100 个 url
我认为从本地数据库获取一条记录并尝试在 100 个不同的远程调用中找到它不是一个好主意 - 相反,最好将 workflow/loops 基于获取的远程数据并尝试找到本地数据库中的相应元素
如果您认为该方法适合您的任务 - 我当然可以帮助您编写代码:)
我正在尝试解析从远程 Web 服务生成的大量 JSON 数据。生成的输出跨 500 个 URI 分页,每个 URI 包含 100 JSON 个对象。我需要在每个 JSON 对象中匹配一个 属性,它是 DOI(数字对象标识符),与从本地数据库获取的相应字段相匹配,然后更新记录。
我遇到的问题是控制我的循环结构以寻找匹配的 JSON DOI,同时确保所有数据都已被解析。
如您所见,我尝试使用 break 和 continue 语句的组合,但我无法 'move' 超出第一个 URI。
我后来引入了一个标志变量来帮助控制循环无效。
while($obj = $result->fetch_object()){
for($i=1;$i<=$outputs_json['meta']['response']['total-pages'];$i++){
$url = 'xxxxxxxxxxxxxxx&page%5Bnumber%5D='."$i".'&page%5Bsize%5D=100';
if($outputs = json_decode(file_get_contents($url),true)===false){
}
else{
try{
$outputs = json_decode(file_get_contents($url),true);
$j=0;
do{
$flag = false;
$doi = trim($outputs['data'][$j]['attributes']['identifiers']['dois'][0], '"');
if(!utf8_encode($obj->doi)===$doi) continue;
}else{
$flag = true;
$j++;
}
}while($j!==101);
if($flag===true) break;
} catch(Exception $e) {
}
}
}
}
} 什么是保证解析所有 URI 中的每个 JSON 对象并且仅当获取记录的 DOI 字段与传入 JSON 的 DOI 属性 匹配时才在我的数据库上执行 CRUD 操作的最佳方法] 数据?
我不是 100% 确定我理解你问题的每个方面,但对我来说改变执行顺序是有意义的
- 从外部服务获取页面
- 解码 json 并遍历所有 100 个对象
- 获得一个 DOI
- 从数据库中获取相应的记录
- 更改数据库记录
- 当所有 json 对象都已完成时 - 获取下一个 url
- 解码 json 并遍历所有 100 个对象
- 重复直到获取所有 100 个 url
我认为从本地数据库获取一条记录并尝试在 100 个不同的远程调用中找到它不是一个好主意 - 相反,最好将 workflow/loops 基于获取的远程数据并尝试找到本地数据库中的相应元素
如果您认为该方法适合您的任务 - 我当然可以帮助您编写代码:)