123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- <?php
- namespace Aws\Api\Serializer;
- use Aws\Api\Service;
- use Aws\Api\Shape;
- use Aws\Api\TimestampShape;
- use Aws\Exception\InvalidJsonException;
- /**
- * Formats the JSON body of a JSON-REST or JSON-RPC operation.
- * @internal
- */
- class JsonBody
- {
- private $api;
- public function __construct(Service $api)
- {
- $this->api = $api;
- }
- /**
- * Gets the JSON Content-Type header for a service API
- *
- * @param Service $service
- *
- * @return string
- */
- public static function getContentType(Service $service)
- {
- if ($service->getMetadata('protocol') === 'rest-json') {
- return 'application/json';
- }
- $jsonVersion = $service->getMetadata('jsonVersion');
- if (empty($jsonVersion)) {
- throw new \InvalidArgumentException('invalid json');
- } else {
- return 'application/x-amz-json-'
- . @number_format($service->getMetadata('jsonVersion'), 1);
- }
- }
- /**
- * Builds the JSON body based on an array of arguments.
- *
- * @param Shape $shape Operation being constructed
- * @param array $args Associative array of arguments
- *
- * @return string
- */
- public function build(Shape $shape, array $args)
- {
- $result = json_encode($this->format($shape, $args));
- return $result == '[]' ? '{}' : $result;
- }
- private function format(Shape $shape, $value)
- {
- switch ($shape['type']) {
- case 'structure':
- $data = [];
- if (isset($shape['document']) && $shape['document']) {
- return $value;
- }
- foreach ($value as $k => $v) {
- if ($v !== null && $shape->hasMember($k)) {
- $valueShape = $shape->getMember($k);
- $data[$valueShape['locationName'] ?: $k]
- = $this->format($valueShape, $v);
- }
- }
- if (empty($data)) {
- return new \stdClass;
- }
- return $data;
- case 'list':
- $items = $shape->getMember();
- foreach ($value as $k => $v) {
- $value[$k] = $this->format($items, $v);
- }
- return $value;
- case 'map':
- if (empty($value)) {
- return new \stdClass;
- }
- $values = $shape->getValue();
- foreach ($value as $k => $v) {
- $value[$k] = $this->format($values, $v);
- }
- return $value;
- case 'blob':
- return base64_encode($value);
- case 'timestamp':
- $timestampFormat = !empty($shape['timestampFormat'])
- ? $shape['timestampFormat']
- : 'unixTimestamp';
- return TimestampShape::format($value, $timestampFormat);
- default:
- return $value;
- }
- }
- }
|