从Web服务解析分页json

时间:2018-07-07 11:29:12

标签: php json web-services doi

我正在尝试分析从远程Web服务生成的大量JSON数据。产生的输出在500个URI中分页,每个URI包含100个JSON对象。我需要将每个JSON对象中的属性(即DOI(数字对象标识符))与从本地数据库中获取的相应字段进行匹配,然后更新记录。

我遇到的问题是控制循环结构以查找匹配的JSON DOI,同时确保已解析所有数据。

如您所见,我尝试使用break和continue语句的组合,但是我无法“移动”超出第一个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操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我不是100%确信我理解您提出的问题的各个方面,但对我而言,更改执行顺序是很有意义的

  • 从外部服务获取页面
    • 解码json并遍历所有100个对象
      • 获得一个DOI
      • 从数据库中获取相应的记录
      • 更改数据库记录
    • 所有json对象都处理完毕时-获取下一个URL
  • 重复执行,直到获取所有100个网址

我认为从本地数据库中获取一条记录并尝试在100个不同的远程调用中找到它不是一个好主意-相反,最好将工作流/循环基于获取的远程数据并尝试在您的数据库中找到相应的元素本地数据库

如果您认为该方法适合您的任务-我当然可以为您提供代码:)