1

DBpedia の json 応答に問題があります。

次のコードでクエリを生成します。

$resourceName = ($this->name);
$format = 'json';
$query = "
  SELECT  ?key ?onto WHERE {
   <http://dbpedia.org/resource/".$resourceName."> ?onto ?key .
  }";
$searchUrl = 'http://dbpedia.org/sparql?'
            .'query='.urlencode($query)
            .'&format='.$format;

次に、これを PHP CURL で実行します

private function curlRequestDbPedia($url, $checkIfExists = 0){
    if (!function_exists('curl_init')){die('CURL is not installed!');}
    $ch= curl_init();
    curl_setopt($ch,
        CURLOPT_URL,
        $url);
    curl_setopt($ch,
        CURLOPT_RETURNTRANSFER,
        TRUE);

    $response = curl_exec($ch);
    curl_close($ch);
    $responseJSON = json_decode($response,TRUE);

    if(json_last_error() != 0){
        echo "ERROR: ".json_last_error();   // -.-
    }
    return $responseJSON;
}

「ハンブルグ」のクエリを生成した場合

クエリ:

SELECT  ?key ?onto WHERE <http://dbpedia.org/resource/Hamburg> ?onto ?key }

への CURL リクエスト

http://dbpedia.org/sparql?query=%0D%0A%09%09SELECT++%3Fkey+%3Fonto+WHERE+%7B%0D%0A%09%09%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FHamburg%3E+%3Fonto+%3Fkey+.%0D%0A%09%09%7D&format=json

正常に動作し、json_encode エラーが発生しません!

しかし、DBpedia に「スウェーデン」を尋ねると、

SELECT  ?key ?onto WHERE {<http://dbpedia.org/resource/Sweden> ?onto ?key }

次の URL を使用します。

http://dbpedia.org/sparql?query=%0D%0A%09%09SELECT++%3Fkey+%3Fonto+WHERE+%7B%0D%0A%09%09%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FSweden%3E+%3Fonto+%3Fkey+.%0D%0A%09%09%7D&format=json

DBpedia からの応答をエンコードしようとすると、ERROR: 4 (Syntax Error) が返されます。

私は応答jsonデータをwww.jsonlint.comに置き、サイトは私に、2008行目にエラーがあると言いました。

{
"key": {
  "type": "uri",
  "value": "http://got.dbpedia.org/resource/\U00010343\U00010345\U00010334\U00010330\U00010342\U00010334\U00010339\U0001033A\U00010339"
            }, ...

ここに画像の説明を入力

誰かが私のエラーを説明できますか? またはなぜそれが発生するのですか?

そして多分私はそれをどのように機能させるのですか?

私の推測では、それはエスケープ文字 ("\U00010343....") までです。

よろしくお願いします

4

0 に答える 0