JsonParser.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace Aws\Api\Parser;
  3. use Aws\Api\DateTimeResult;
  4. use Aws\Api\Shape;
  5. /**
  6. * @internal Implements standard JSON parsing.
  7. */
  8. class JsonParser
  9. {
  10. public function parse(Shape $shape, $value)
  11. {
  12. if ($value === null) {
  13. return $value;
  14. }
  15. switch ($shape['type']) {
  16. case 'structure':
  17. if (isset($shape['document']) && $shape['document']) {
  18. return $value;
  19. }
  20. $target = [];
  21. foreach ($shape->getMembers() as $name => $member) {
  22. $locationName = $member['locationName'] ?: $name;
  23. if (isset($value[$locationName])) {
  24. $target[$name] = $this->parse($member, $value[$locationName]);
  25. }
  26. }
  27. if (isset($shape['union'])
  28. && $shape['union']
  29. && is_array($value)
  30. && empty($target)
  31. ) {
  32. foreach ($value as $key => $val) {
  33. $target['Unknown'][$key] = $val;
  34. }
  35. }
  36. return $target;
  37. case 'list':
  38. $member = $shape->getMember();
  39. $target = [];
  40. foreach ($value as $v) {
  41. $target[] = $this->parse($member, $v);
  42. }
  43. return $target;
  44. case 'map':
  45. $values = $shape->getValue();
  46. $target = [];
  47. foreach ($value as $k => $v) {
  48. $target[$k] = $this->parse($values, $v);
  49. }
  50. return $target;
  51. case 'timestamp':
  52. return DateTimeResult::fromTimestamp(
  53. $value,
  54. !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null
  55. );
  56. case 'blob':
  57. return base64_decode($value);
  58. default:
  59. return $value;
  60. }
  61. }
  62. }