KRLを使用してAPI経由でGoogleにリクエストを送信しています。これは、Googleから返される文字通りの応答です。
handleResponse({ "data": { "responses": [ { "response": "successful" } ] } } );
これは「有効な」JSON構文ではないため、pickを使用してこれを処理することをどのように推奨しますか?有効なJSON構文が含まれていますが、全体としては無効です。ご協力いただきありがとうございます。
KRLを使用してAPI経由でGoogleにリクエストを送信しています。これは、Googleから返される文字通りの応答です。
handleResponse({ "data": { "responses": [ { "response": "successful" } ] } } );
これは「有効な」JSON構文ではないため、pickを使用してこれを処理することをどのように推奨しますか?有効なJSON構文が含まれていますが、全体としては無効です。ご協力いただきありがとうございます。
更新:Google翻訳APIを見ると、JSONPコールバックパラメーターはオプションのようです。コールバックを指定しないでください。そうすれば、この問題は発生しなくなります。:)
http://code.google.com/apis/language/translate/v2/using_rest.html#WorkingResults
より良いオプション:
可能であれば、Google APIの呼び出しで、コールバック関数がないことを指定します。JSONPの代わりにプレーンJSONをリクエストできる場合は、pick演算子を使用できます。
それほど良いオプションではありません:
APIがJSONPのみを返す場合は、正規表現の置換を実行してJSONからパディングを削除できます。これにより、pick演算子を使用できるようになります。
必要なもの:
完全なアプリの例:
ruleset a60x494 {
meta {
name "jsonp-to-json-test"
description <<
jsonp-to-json-test
>>
author "Mike Grace"
logging on
}
global {
returnedJsonpAsString = 'handleResponse({ "data": { "responses": [ { "response": "successful" } ] } } );';
datasource googleApi <- "blah blah blah";
}
rule fix_jsonp_to_json {
select when pageview ".*"
pre {
cleanJson = returnedJsonpAsString.replace(re/^.*\((.*)\);/,"$1");
response = cleanJson.decode().pick("$..response");
}
{
notify("Response",response) with sticky = true;
emit <|
console.log(returnedJsonp);
console.log(cleanJson);
|>;
}
}
}