Guzzle změna JSON formátu

Laxren
Backer | 22
+
0
-

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.

uživatel-p
Člen | 553
+
+3
-

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'
			]
		]
	]
]
Laxren
Backer | 22
+
+1
-

Moc díky za vysvětlení a ukázky @Polki :)
Už se to rozběhalo.