| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | <?phpnamespace 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;        }    }}
 |