Не удалось декодировать JSON - PullRequest
0 голосов
/ 20 июня 2019

Ниже приведен фрагмент кода, где я наблюдаю ошибку: «искаженная строка JSON, ни массив, ни объект, ни число, ни строка, ни атом, со смещением символа 0 (перед» (конец строки) ») в«

Наблюдаемая ошибка находится в строке decode_json. Может кто-нибудь указать в чем ошибка?

my $serverurl = "http://mycompany.net/rest/api/2/";

my $username        = 'my.email@domain.com';
my $password        = "mypassword\@2019";
my $i ;
my $test;

my $headers = {Accept => 'application/json', Authorization => 'Basic ' .encode_base64($username . ':' . $password)};
my $client = REST::Client->new();

my $idartinstance;
my $idartinstance1;

 if (!$idartinstance)
    {
        print " Trying to Connect to URL using REST client interface \n\n";
        $idartinstance1 = $client->GET($serverurl."serverinfo",$headers);

        $idartinstance = decode_json($idartinstance1->responseContent());

    }

Когда я печатаю $idartinstance, я получаю это:

REST::Client=HASH(0x8682024)->responseContent()

Означает ли это, что он не может найти клиента REST?

[РЕДАКТИРОВАТЬ] Я изменил сценарий, как показано ниже, и нет разницы в ошибках.

my $serverurl = "https://mycompany.net/rest/api/3/";
my $username        = 'my.email@domain.com';
my $password        = 'pf9fCdkGXmi4pMHiwIh74A0D';

my $headers = {Accept => 'application/json', Authorization => 'Basic ' . encode_base64($username . ':' . $password)};

my $client = REST::Client->new();
if (!$idartinstance)
    {
        print " Trying to Connect to JIRA using REST client interface \n\n";

        $client->GET($serverurl."serverInfo", $headers);
        print $client->responseContent();
        $idartinstance = decode_json($client->responseContent());
    }

Теперь я использовал зашифрованный пароль. Ошибка та же: искаженная строка JSON, ни массив, ни объект, ни число, ни строка, ни атом, со смещением символа 0 (перед «(конец строки)»). Попытка доступа к "https://mycompany.net/rest/api/3/serverInfo" через веб-браузер и возможность получить детали.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Получив ответ, вы должны проверить, что вы хотите.

if( $client->responseCode() eq '200' ){
    print "Success\n";
}

Возможно, вы также захотите убедиться, что тип контента соответствует ожидаемому. Если это должен быть JSON, проверьте, что это:

if( $client->responseHeader('Content-Type') =~ m|\Aapplication/json\b| ) {
    print "Got JSON\n";
}

Как только вы установили, что у вас есть то, что вы хотели, передайте тело сообщения декодеру JSON.

my $data = decode_json($client->responseContent());

Вы также можете попытаться перехватить ошибки, если у вас должен быть действительный JSON, но этого нет. Блок eval может справиться с этим (и увидеть множество источников правильного использования eval для его наилучшего использования):

my $data = eval { decode_json(...) };

Я обнаружил, что, как правило, получаю неправильный контент в двух ситуациях:

  • неверная конечная точка, из которой обработчик 404 возвращает HTML
  • портал, который также возвращает HTML
0 голосов
/ 20 июня 2019

Я думаю, вы неправильно читаете документацию для модуля .Из приведенного здесь синопсиса пример, который больше всего похож на ваш, является первым:

my $client = REST::Client->new();
$client->GET('http://example.com/dir/file.xml');
print $client->responseContent();

Обратите внимание, в частности, на то, что этот пример ничего не делает с возвращаемым значением из GET().В вашем примере вы делаете эквивалент этого:

my $client = REST::Client->new();
my $resp = $client->GET('http://example.com/dir/file.xml');
print $resp->responseContent();

Как это происходит, хотя нет задокументированного возвращаемого значения из GET() [ Обновление: Я ошибся здесь - см.первый комментарий - но возвращаемое значение действительно предназначено только для цепочки вызовов методов], оно фактически возвращает объект, который был передан, поэтому ваш подход должен работать.Но, как правило, плохая идея - не следовать документации.

Так что же на самом деле идет не так?Ну, я не уверен.Как я уже сказал, ваш подход должен (случайно) работать.Но сообщение об ошибке, которое вы получаете, говорит нам, что вы передаете decode_json() объект REST :: Client, а не строку, содержащую JSON.Я не думаю, что так должен работать ваш код.Возможно, код, который вы нам показали, на самом деле не тот код, который вы запускаете.

Лучший способ отладить это - следовать совету Квентина в первом комментарии к вашему вопросу - выведите значение, котороевы пытаетесь перейти к decode_json() перед передачей функции.На самом деле, это хороший общий совет по программированию - сначала пишите свой код шаг за шагом, и объединяйте шаги только тогда, когда вы знаете, что отдельные шаги работают правильно.

Используя имена переменных, я думаю, что ваш код должен выглядетьнапример:

my $client = REST::Client->new();

# ...other code...

$client->GET($serverurl."serverinfo", $headers);

print $client->responseContent();

# And, only once you've established that
# $client->responseContent() returns what
# you expect, you can add this:

$idartinstance = decode_json($client->responseContent());

Если оператор print() не показывает JSON, тогда обновите свой вопрос , чтобы добавить все, что напечатано, и мы еще посмотрим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...