2015-04-22 5 views
1

Во-первых, спасибо за чтение. Вот мой кодпроблемы с отображением данных json, полученных с помощью php curl

что выглядит мои данные JSON, как при просмотре в браузере с помощью URL,

{ 
    "$totalResults": 1500, 
    "$startIndex": 1, 
    "$itemsPerPage": 3, 
    "$resources": [ 
    { 
     "$uuid": "5e7b9312-52e5-4fe1-b3e4-633ca04c9764", 
     "$httpStatus": "OK", 
     "$descriptor": "", 
     "name": "Heinz Tomato Sauce Sachets Qty 200" 
    }, 
    { 
     "$uuid": "1a0f9dca-c417-4cff-94d2-99d16438723f", 
     "$httpStatus": "OK", 
     "$descriptor": "", 
     "name": "Heinz Brown Sauce Sachet Qty 200" 
    }, 
    { 
     "$uuid": "126fdb17-81ce-41b4-bdba-91d0a170262a", 
     "$httpStatus": "OK", 
     "$descriptor": "", 
     "name": "Heinz English Mustard Sachets Qty 300" 
    } 
    ] 
} 

test2.php

<?php 

// SAGE URL 
$url = 'http://localhost:5493/sdata/accounts50/GCRM/-/commodities?select=name&count=3&format=json'; 

//SAGE USERNAME & PASSWORD 
$username = 'test'; 
$password = 'test'; 


    //initiaize 
$ch = curl_init(); 

    //set options  
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0);   

    //execute 
$result = curl_exec($ch); 

    //close curl session/free resources 
curl_close($ch); 

$json = json_decode($result); 

foreach ($json->{'$resources'} as $mydata) { 
    echo $mydata->name; 
}; 

?> 

ошибки им получать

Notice: Trying to get property of non-object in C:\xampp\htdocs\Sage Json\test2.php on line 29 

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\Sage Json\test2.php on line 29 

Я не уверен, что происходит не так, это работает, если я получаю одни и те же данные из файла, но не, если я получаю его из res т сервер, и если кто-то может пролить некоторый свет, я был бы признателен

+0

проверьте, что происходит в переменной $ json и $ result. – mohit

+0

не уверен, что использовать, я сделал ver_dump (isset()); и & results имеет материал внутри него, но $ json не уверен, почему. – Ajking11

ответ

0

им действительно жаль, что никогда не возвращаться к вам. так что получается, что когда вы получаете данные из сервиса sage, он возвращается вам в «utf 8 bom».

Поэтому, прежде чем я смогу отобразить любую вещь, мне нужно было удалить формат, очистив первые три символа в массиве. с функцией substr().

$json_data = substr($json_data, 3); 

Благодарим вас за помощь в решении этой проблемы.

1

PHP json_decode функция возвращает массив и не объект, поэтому вместо того, чтобы использовать

foreach ($json->{'$resources'} as $mydata) { 
    echo $mydata->name; 
}; 

вы должны использовать

foreach ($json['$resources'] as $mydata) { 
    echo $mydata['name']; 
}; 

ОБНОВЛЕНИЕ

Ваш test2.php должен выглядеть следующим образом:

<?php 

// SAGE URL 
$url = 'http://localhost:5493/sdata/accounts50/GCRM/-/commodities?select=name&count=3&format=json'; 

//SAGE USERNAME & PASSWORD 
$username = 'test'; 
$password = 'test'; 


//initiaize 
$ch = curl_init(); 

//set options 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

//execute 
$result = curl_exec($ch); 

//close curl session/free resources 
curl_close($ch); 

$json = json_decode($result); 
$json = (array)$json; 

foreach ($json['$resources'] as $mydata) { 
    echo $mydata->name . "<br>"; 
}; 

В вашем коде основная проблема заключалась в присвоении имени атрибуту JSON $resources: он назван как переменная PHP, и это вызывает проблему.

Преобразование декодированной переменной в массив решает проблему, поскольку ключ ассоциативного массива представляет собой строку.

+0

изменение значения foreach: 'Предупреждение: неверный аргумент, предоставленный foreach() в C: \ xampp \ htdocs \ Sage Json \ test2.php в строке 29' – Ajking11

+0

Были ли вы в состоянии разрешить недопустимый символ в начале вашего json-файл, который вызывает вышеупомянутый ответ –

2

Ajking11 причина ваш недействительный аргумент, поставляемый для Еогеаспа() является то, что $ JSON vairiable перезаписывается и имеет никаких данных не попробует Somthing как этого

<?php 

// SAGE URL 
$url = 'http://localhost:5493/sdata/accounts50/GCRM/-/commodities?select=name&count=3'; 

//SAGE USERNAME & PASSWORD 
$username = 'test'; 
$password = 'test'; 


//initiaize 
$ch = curl_init(); 

//set options 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

//execute 
$result = curl_exec($ch); 

//close curl session/free resources 
curl_close($ch); 
$xml = simplexml_load_string($result); 
$data = json_encode($xml); 
$arr = json_decode($data,TRUE); 


foreach ($arr['entry'] as $k=>$v){ 
    echo $v; // etc. 
} 

отметить, что я удалил & формат = JSON и кодируемый позже надеюсь, что это поможет, дайте мне знать, как ваш получать на

+0

Я делал немного больше исследований по этому вопросу, и кажется, что $ result часть $ json_decode недействительна json-код, поэтому возвращает null –

2

вы могли бы использовать этот код и оптимизировать его для ваших потребностей

<?php 
    // SAGE URL 
     //$url = 'http://computer_2:5493/sdata/accounts50/GCRM/-/commodities?select=name&count=3&select=name&count=10&format=json'; 
     $url ='http://localhost:5493/sdata/accounts50/GCRM/-/tradingAccounts?select=name&count=10'; 
     //SAGE USERNAME & PASSWORD 
     $username = 'MANAGER'; 
     $password = ''; 

     //initiaize 
     $ch = curl_init(); 

     //set options 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); 
     curl_setopt($ch, CURLOPT_HTTPGET, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 

     //execute 
     $result = curl_exec($ch); 

     //close curl session/free resources 
     curl_close($ch); 
     $xml = simplexml_load_string($result); 



foreach($xml->xpath("//sdata:payload") as $entry) { 
    // xpath here must be from payload to tradingAccount 
    $content = $entry->xpath("./crm:tradingAccount"); 
    foreach($content as $c) { 
     // Make set of children with prefix crm 
     $nodes = $c->children('crm', true); 
     echo $nodes->reference . " | " . $nodes->name . "/" . $nodes->openedDate . "<br />\n"; 

    } 
} 

благодаря PHPhil и splash58 за помощь с вопросом пространства имен

2

Как Artful_dodger сказать это JSON проблема вот как я бы решить это

<?php 

// SAGE URL 
$url = 'http://localhost:5493/sdata/accounts50/GCRM/-/commodities?select=name&count=3&format=json'; 

//SAGE USERNAME & PASSWORD 
$username = 'MANAGER'; 
$password = ''; 


//initiaize 
$ch = curl_init(); 

//set options 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

//execute 
$result = curl_exec($ch); 

//close curl session/free resources 
curl_close($ch); 

// doing a substring as there are 3 weird characters being passed back from IIS in front of the string 
$json = json_decode(substr($result, 3, strlen($result)), true); 


    foreach ($json['$resources'] as $mydata) { 
     echo $mydata['name'] . "<br>"; 
    } 
Смежные вопросы