从 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 基于获取的远程数据并尝试找到本地数据库中的相应元素

如果您认为该方法适合您的任务 - 我当然可以帮助您编写代码:)