support for arrays with inline JSON, which resulted in better support for aliexpress.postproduct.redefining.categoryforecast response data
This commit is contained in:
parent
294211417d
commit
e0790363a9
@ -19,6 +19,7 @@ use JMS\Serializer\Exception\RuntimeException;
|
|||||||
use JMS\Serializer\Metadata\ClassMetadata;
|
use JMS\Serializer\Metadata\ClassMetadata;
|
||||||
use JMS\Serializer\Metadata\PropertyMetadata;
|
use JMS\Serializer\Metadata\PropertyMetadata;
|
||||||
use JMS\Serializer\Visitor\DeserializationVisitorInterface;
|
use JMS\Serializer\Visitor\DeserializationVisitorInterface;
|
||||||
|
use JsonException;
|
||||||
use SplStack;
|
use SplStack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -201,6 +202,21 @@ class JsonDeserializationVisitor extends AbstractVisitor implements Deserializat
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ('array' === $metadata->type['name'] && is_array($data[$metadata->serializedName])) {
|
||||||
|
$newList = [];
|
||||||
|
|
||||||
|
foreach ($data[$metadata->serializedName] as $key => $item) {
|
||||||
|
$newList[$key] = json_decode(
|
||||||
|
$item,
|
||||||
|
true,
|
||||||
|
512,
|
||||||
|
JSON_THROW_ON_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data[$metadata->serializedName] = $newList;
|
||||||
|
} else {
|
||||||
$data[$metadata->serializedName] = json_decode(
|
$data[$metadata->serializedName] = json_decode(
|
||||||
$data[$metadata->serializedName],
|
$data[$metadata->serializedName],
|
||||||
true,
|
true,
|
||||||
@ -208,6 +224,14 @@ class JsonDeserializationVisitor extends AbstractVisitor implements Deserializat
|
|||||||
JSON_THROW_ON_ERROR
|
JSON_THROW_ON_ERROR
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} catch (JsonException $exception) {
|
||||||
|
if (in_array('InlineJsonBodyNullIfInvalid', $metadata->groups ?? [])) {
|
||||||
|
$data[$metadata->serializedName] = null;
|
||||||
|
} else {
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (true === $metadata->inline) {
|
if (true === $metadata->inline) {
|
||||||
if (!$metadata->type) {
|
if (!$metadata->type) {
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHP version 7.4
|
||||||
|
*
|
||||||
|
* @category CategorySuitabilityDto
|
||||||
|
* @package RetailCrm\Model\Response\AliExpress\Result
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license http://retailcrm.ru Proprietary
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace RetailCrm\Model\Response\AliExpress\Result;
|
||||||
|
|
||||||
|
use JMS\Serializer\Annotation as JMS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CategorySuitabilityDto
|
||||||
|
*
|
||||||
|
* @category CategorySuitabilityDto
|
||||||
|
* @package RetailCrm\Model\Response\AliExpress\Result
|
||||||
|
* @author RetailDriver LLC <integration@retailcrm.ru>
|
||||||
|
* @license https://retailcrm.ru Proprietary
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see https://help.retailcrm.ru
|
||||||
|
*/
|
||||||
|
class CategorySuitabilityDto
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var float $score
|
||||||
|
*
|
||||||
|
* @JMS\Type("float")
|
||||||
|
* @JMS\SerializedName("score")
|
||||||
|
*/
|
||||||
|
public $score;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var float $score
|
||||||
|
*
|
||||||
|
* @JMS\Type("float")
|
||||||
|
* @JMS\SerializedName("suitabilityRank")
|
||||||
|
*/
|
||||||
|
public $suitabilityRank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int $categoryId
|
||||||
|
*
|
||||||
|
* @JMS\Type("int")
|
||||||
|
* @JMS\SerializedName("categoryId")
|
||||||
|
*/
|
||||||
|
public $categoryId;
|
||||||
|
}
|
@ -27,10 +27,11 @@ use JMS\Serializer\Annotation as JMS;
|
|||||||
class CategorySuitabilityList
|
class CategorySuitabilityList
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var string[] $json
|
* @var \RetailCrm\Model\Response\AliExpress\Result\CategorySuitabilityDto[] $json
|
||||||
*
|
*
|
||||||
* @JMS\Type("array<string>")
|
* @JMS\Type("array<RetailCrm\Model\Response\AliExpress\Result\CategorySuitabilityDto>")
|
||||||
* @JMS\SerializedName("json")
|
* @JMS\SerializedName("json")
|
||||||
|
* @JMS\Groups({"InlineJsonBody", "InlineJsonBodyNullIfInvalid"})
|
||||||
*/
|
*/
|
||||||
public $json;
|
public $json;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ EOF;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testClientAliexpressPostproductRedefiningCategoryForecast()
|
public function testClientAliexpressPostproductRedefiningCategoryForecastEmpty()
|
||||||
{
|
{
|
||||||
$json = <<<'EOF'
|
$json = <<<'EOF'
|
||||||
{
|
{
|
||||||
@ -220,15 +220,64 @@ EOF;
|
|||||||
"The result of dii is empty. It should have a correct JSON format data return.",
|
"The result of dii is empty. It should have a correct JSON format data return.",
|
||||||
$response->responseData->result->errorMessage
|
$response->responseData->result->errorMessage
|
||||||
);
|
);
|
||||||
self::assertEquals(
|
self::assertNull($response->responseData->result->categorySuitabilityList->json);
|
||||||
['N/A'],
|
|
||||||
$response->responseData->result->categorySuitabilityList->json
|
|
||||||
);
|
|
||||||
self::assertEquals('20181101111211', $response->responseData->result->timeStamp);
|
self::assertEquals('20181101111211', $response->responseData->result->timeStamp);
|
||||||
self::assertEquals('24000011', $response->responseData->result->errorCode);
|
self::assertEquals('24000011', $response->responseData->result->errorCode);
|
||||||
self::assertTrue($response->responseData->result->success);
|
self::assertTrue($response->responseData->result->success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testClientAliexpressPostproductRedefiningCategoryForecast()
|
||||||
|
{
|
||||||
|
$json = <<<'EOF'
|
||||||
|
{
|
||||||
|
"aliexpress_postproduct_redefining_categoryforecast_response": {
|
||||||
|
"result": {
|
||||||
|
"category_suitability_list": {
|
||||||
|
"json": [
|
||||||
|
"{\"score\":0.696,\"suitabilityRank\":1,\"categoryId\":200000346}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"success": true,
|
||||||
|
"time_stamp": "2019-07-15 13:49:58"
|
||||||
|
},
|
||||||
|
"request_id": "10ixzzbmna198"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
$mock = self::getMockClient();
|
||||||
|
$mock->on(
|
||||||
|
RequestMatcher::createMatcher('api.taobao.com')
|
||||||
|
->setPath('/router/rest')
|
||||||
|
->setOptionalQueryParams([
|
||||||
|
'app_key' => self::getEnvAppKey(),
|
||||||
|
'method' => 'aliexpress.postproduct.redefining.categoryforecast',
|
||||||
|
'session' => self::getEnvToken()
|
||||||
|
]),
|
||||||
|
$this->responseJson(200, $json)
|
||||||
|
);
|
||||||
|
$client = ClientBuilder::create()
|
||||||
|
->setContainer($this->getContainer($mock))
|
||||||
|
->setAppData($this->getEnvAppData())
|
||||||
|
->setAuthenticator($this->getEnvTokenAuthenticator())
|
||||||
|
->build();
|
||||||
|
|
||||||
|
$request = new PostproductRedefiningCategoryForecast();
|
||||||
|
$request->subject = 'man t-shirt';
|
||||||
|
$request->locale = 'en';
|
||||||
|
|
||||||
|
/** @var PostproductRedefiningCategoryForecastResponse $response */
|
||||||
|
$response = $client->sendAuthenticatedRequest($request);
|
||||||
|
$items = $response->responseData->result->categorySuitabilityList->json;
|
||||||
|
|
||||||
|
self::assertCount(1, $items);
|
||||||
|
|
||||||
|
$item = $response->responseData->result->categorySuitabilityList->json[0];
|
||||||
|
|
||||||
|
self::assertEquals(0.696, $item->score);
|
||||||
|
self::assertEquals(1, $item->suitabilityRank);
|
||||||
|
self::assertEquals(200000346, $item->categoryId);
|
||||||
|
}
|
||||||
|
|
||||||
public function testClientAliexpressSolutionFeedSubmit()
|
public function testClientAliexpressSolutionFeedSubmit()
|
||||||
{
|
{
|
||||||
$json = <<<'EOF'
|
$json = <<<'EOF'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user