Guzzle změna JSON formátu
- Laxren
- Backer | 23
Zdravím,
posílám data pomocí REST API a Guzzlu. Požadavek na druhé straně je, aby v jsonu bylo pole, namísto objektu (změna závorek). Když to ale udělám, tak vyhodí exception:
GuzzleHttp\Exception\ServerException #500
Server error: `PUT https://urladresa.cz/api/company` resulted in a `500 Internal Server Error` response:
{"type":"BackEnd","message":"JsonParseException: Unexpected character (\u0027:\u0027 (code 58)): was expecting comma to (truncated...)
Příklad:
//neakceptuje
{
...
addresses: {
one: {
...
},
two: {
...
},
}
}
//v pořádku ( změna závorek {} -> [] )
{
...
addresses: [
one: {
...
},
two: {
...
},
]
}
Příklad spojení:
<?php
$guzzle = new \GuzzleHttp\Client();
$guzzle_request = new \GuzzleHttp\Psr7\Request('PUT', 'https://urladresa.cz/api/company', [
'X-Instance-Name' => $this->fInstanceName,
'Content-Type' => 'application/json; charset=UTF-8'
]);
$response = $guzzle->send($guzzle_request, [
'auth' => [$this->fUserName,$this->fApiKey],
'body' = Json::encode($array) // Posílaná data
]);
?>
Posílaná data (před encode):
<?php
array(
'name' => 'Raz',
'addresses' => array(
'one' => array(
'name' => 'raz'
),
'two' => array(
'name' => 'raz2'
)
)
)
?>
Dá se nějak udělat, aby to prošlo? Budu to muset udělat bez Guzzle?
A dá se nějak lehce změnit při encode ty závorky?
Děkuji.
- Polki
- Člen | 553
V JSONu není jen změna závorek u pole…
JSON vlastně bere pole (indexované 0 – n čísly) jako pole a asociativní pole (indexované jinými hodnotami než čísly, nebo na přeskáčku) jako objekt. Tak se chová JavaScript, který JSONem popisuje objekty a pole.
Tedy není třeba jen změnit závorky, protože tím, co jsi napsal kombinuješ pole a objekt dohromady a to je nevalidní.
správně je to třeba takto:
{
...
addresses: [
{
...
},
{
...
}
]
}
nebo
{
...
addresses: [
{
one: {
...
}
},
{
two: {
...
}
}
]
}
atd.
PHP pole by mělo vypadat pak takto:
array(
'name' => 'Raz',
'addresses' => array(
array(
'name' => 'raz'
),
array(
'name' => 'raz2'
)
)
)
případně takto:
array(
'name' => 'Raz',
'addresses' => array(
array(
'one' => array(
'name' => 'raz'
),
),
array(
'two' => array(
'name' => 'raz2'
)
)
)
)
atd..
Jo a pokud možno nepoužívej array()
pro definování pole. Je
to zastaralý způsob. Dnes můžeš už klasicky používat []:
[
'name' => 'Raz',
'addresses' => [
[
'one' => [
'name' => 'raz'
],
],
[
'two' => [
'name' => 'raz2'
]
]
]
]