[
  {
    "description": "Scalar members",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "Str": {
            "shape": "StringType"
          },
          "Num": {
            "shape": "IntegerType"
          },
          "FalseBool": {
            "shape": "BooleanType"
          },
          "TrueBool": {
            "shape": "BooleanType"
          },
          "Float": {
            "shape": "FloatType"
          },
          "Double": {
            "shape": "DoubleType"
          },
          "Long": {
            "shape": "LongType"
          },
          "Char": {
            "shape": "CharType"
          }
        }
      },
      "StringType": {
        "type": "string"
      },
      "IntegerType": {
        "type": "integer"
      },
      "BooleanType": {
        "type": "boolean"
      },
      "FloatType": {
        "type": "float"
      },
      "DoubleType": {
        "type": "double"
      },
      "LongType": {
        "type": "long"
      },
      "CharType": {
        "type": "character"
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "Str": "myname",
          "Num": 123,
          "FalseBool": false,
          "TrueBool": true,
          "Float": 1.2,
          "Double": 1.3,
          "Long": 200,
          "Char": "a"
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"Str\": \"myname\", \"Num\": 123, \"FalseBool\": false, \"TrueBool\": true, \"Float\": 1.2, \"Double\": 1.3, \"Long\": 200, \"Char\": \"a\"}"
        },
        "description": "legacy json Scalar members"
      }
    ]
  },
  {
    "description": "Blob members",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "BlobMember": {
            "shape": "BlobType"
          },
          "StructMember": {
            "shape": "BlobContainer"
          }
        }
      },
      "BlobType": {
        "type": "blob"
      },
      "BlobContainer": {
        "type": "structure",
        "members": {
          "foo": {
            "shape": "BlobType"
          }
        }
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "BlobMember": "hi!",
          "StructMember": {
            "foo": "there!"
          }
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"BlobMember\": \"aGkh\", \"StructMember\": {\"foo\": \"dGhlcmUh\"}}"
        },
        "description": "legacy json Blob members"
      }
    ]
  },
  {
    "description": "Timestamp members",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "TimeArg": {
            "shape": "TimestampType"
          },
          "TimeCustom": {
            "timestampFormat": "rfc822",
            "shape": "TimestampType"
          },
          "TimeFormat": {
            "shape": "TimestampFormatType"
          },
          "StructMember": {
            "shape": "TimeContainer"
          }
        }
      },
      "TimeContainer": {
        "type": "structure",
        "members": {
          "foo": {
            "shape": "TimestampType"
          },
          "bar": {
            "shape": "TimestampFormatType"
          }
        }
      },
      "TimestampFormatType": {
        "timestampFormat": "iso8601",
        "type": "timestamp"
      },
      "TimestampType": {
        "type": "timestamp"
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "TimeArg": 1398796238,
          "TimeCustom": 1398796238,
          "TimeFormat": 1398796238,
          "StructMember": {
            "foo": 1398796238,
            "bar": 1398796238
          }
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"TimeArg\": 1398796238, \"TimeCustom\": \"Tue, 29 Apr 2014 18:30:38 GMT\", \"TimeFormat\": \"2014-04-29T18:30:38Z\", \"StructMember\": {\"foo\": 1398796238, \"bar\": \"2014-04-29T18:30:38Z\"}}"
        },
        "description": "legacy json Timestamp members"
      }
    ]
  },
  {
    "description": "Lists",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "ListMember": {
            "shape": "ListType"
          },
          "ListMemberMap": {
            "shape": "ListTypeMap"
          },
          "ListMemberStruct": {
            "shape": "ListTypeStruct"
          }
        }
      },
      "ListType": {
        "type": "list",
        "member": {
          "shape": "StringType"
        }
      },
      "ListTypeMap": {
        "type": "list",
        "member": {
          "shape": "MapType"
        }
      },
      "ListTypeStruct": {
        "type": "list",
        "member": {
          "shape": "StructType"
        }
      },
      "StringType": {
        "type": "string"
      },
      "StructType": {
        "type": "structure",
        "members": {}
      },
      "MapType": {
        "type": "string",
        "key": {
          "shape": "StringType"
        },
        "value": {
          "shape": "StringType"
        }
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "ListMember": [
            "a",
            "b"
          ]
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"ListMember\": [\"a\", \"b\"]}"
        },
        "description": "legacy json Lists 1"
      },
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "ListMember": [
            "a",
            null
          ],
          "ListMemberMap": [
            {},
            null,
            null,
            {}
          ],
          "ListMemberStruct": [
            {},
            null,
            null,
            {}
          ]
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"ListMember\": [\"a\", null], \"ListMemberMap\": [{}, null, null, {}], \"ListMemberStruct\": [{}, null, null, {}]}"
        },
        "description": "legacy json Lists 2"
      }
    ]
  },
  {
    "description": "Maps",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "MapMember": {
            "shape": "MapType"
          }
        }
      },
      "MapType": {
        "type": "map",
        "key": {
          "shape": "StringType"
        },
        "value": {
          "shape": "NumberList"
        }
      },
      "StringType": {
        "type": "string"
      },
      "NumberList": {
        "type": "list",
        "member": {
          "shape": "IntegerType"
        }
      },
      "IntegerType": {
        "type": "integer"
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "MapMember": {
            "a": [
              1,
              2
            ],
            "b": [
              3,
              4
            ]
          }
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"MapMember\": {\"a\": [1, 2], \"b\": [3, 4]}}"
        },
        "description": "legacy json Maps"
      }
    ]
  },
  {
    "description": "Ignores extra data",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "StrType": {
            "shape": "StrType"
          }
        }
      },
      "StrType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {},
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"foo\": \"bar\"}"
        },
        "description": "legacy json Ignores extra data"
      }
    ]
  },
  {
    "description": "Modeled exceptions",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "ExceptionShape": {
        "type": "structure",
        "members": {
          "Status": {
            "shape": "StatusShape",
            "location": "statusCode"
          },
          "BodyMember": {
            "shape": "StringType"
          },
          "Code": {
            "shape": "StringType"
          },
          "Message": {
            "shape": "StringType"
          }
        }
      },
      "OtherExceptionShape": {
        "BodyMember": {
          "shape": "StringType"
        }
      },
      "StatusShape": {
        "type": "integer"
      },
      "StringType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "errors": [
            {
              "shape": "ExceptionShape"
            }
          ],
          "name": "OperationName"
        },
        "error": {
          "Status": 400,
          "BodyMember": "mybody",
          "Code": "OtherExceptionShape",
          "Message": "mymessage"
        },
        "errorCode": "ExceptionShape",
        "errorMessage": "mymessage",
        "response": {
          "status_code": 400,
          "headers": {},
          "body": "{ \"__type\": \"ExceptionShape\", \"Code\": \"OtherExceptionShape\", \"BodyMember\": \"mybody\", \"Message\": \"mymessage\"}"
        },
        "description": "legacy json Modeled exceptions 1"
      },
      {
        "given": {
          "errors": [
            {
              "shape": "ExceptionShape"
            }
          ],
          "name": "OperationName"
        },
        "error": {},
        "errorCode": "OtherExceptionShape",
        "errorMessage": "mymessage",
        "response": {
          "status_code": 400,
          "headers": {},
          "body": "{ \"__type\": \"OtherExceptionShape\", \"Code\": \"ExceptionShape\", \"BodyMember\": \"mybody\", \"Message\": \"mymessage\"}"
        },
        "description": "legacy json Modeled exceptions 2"
      },
      {
        "given": {
          "errors": [
            {
              "shape": "ExceptionShape"
            }
          ],
          "name": "OperationName"
        },
        "error": {},
        "errorCode": "UndefinedShape",
        "response": {
          "status_code": 400,
          "headers": {
            "ImaHeader": "test",
            "X-Foo": "abc"
          },
          "body": "{ \"__type\": \"UndefinedShape\", \"Code\": \"ExceptionShape\", \"BodyMember\": \"mybody\"}"
        },
        "description": "legacy json Modeled exceptions 3"
      }
    ]
  },
  {
    "description": "Modeled exceptions with jsonVersion 1.0",
    "metadata": {
      "protocol": "json",
      "jsonVersion": "1.0"
    },
    "shapes": {
      "ExceptionShape": {
        "type": "structure",
        "members": {
          "Status": {
            "shape": "StatusShape",
            "location": "statusCode"
          },
          "BodyMember": {
            "shape": "StringType"
          },
          "Message": {
            "shape": "StringType"
          }
        }
      },
      "StatusShape": {
        "type": "integer"
      },
      "StringType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "errors": [
            {
              "shape": "ExceptionShape"
            }
          ],
          "name": "OperationName"
        },
        "error": {
          "Status": 400,
          "BodyMember": "mybody",
          "Message": "mymessage"
        },
        "errorCode": "ExceptionShape",
        "errorMessage": "mymessage",
        "response": {
          "status_code": 400,
          "headers": {},
          "body": "{ \"__type\": \"FooPrefix#ExceptionShape\", \"BodyMember\": \"mybody\", \"Message\": \"mymessage\"}"
        },
        "description": "legacy json Modeled exceptions with jsonVersion 1.0"
      }
    ]
  },
  {
    "description": "Serialize document with standalone primitive type in a JSON response",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "inlineDocument": {
            "shape": "DocumentType"
          }
        }
      },
      "DocumentType": {
        "type": "structure",
        "document": true
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "inlineDocument": "foo"
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"inlineDocument\": \"foo\"}"
        },
        "description": "legacy json Serialize document with standalone primitive type in a JSON response 1"
      },
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "inlineDocument": 123
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"inlineDocument\": 123}"
        },
        "description": "legacy json Serialize document with standalone primitive type in a JSON response 2"
      },
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "inlineDocument": true
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"inlineDocument\": true}"
        },
        "description": "legacy json Serialize document with standalone primitive type in a JSON response 3"
      }
    ]
  },
  {
    "description": "Serialize inline document in a JSON response",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "inlineDocument": {
            "shape": "DocumentType"
          }
        }
      },
      "DocumentType": {
        "type": "structure",
        "document": true
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "inlineDocument": {
            "foo": "bar"
          }
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"inlineDocument\": {\"foo\": \"bar\"}}"
        },
        "description": "legacy json Serialize inline document in a JSON response"
      }
    ]
  },
  {
    "description": "Serialize aggregate documents in a JSON response",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "OutputShape": {
        "type": "structure",
        "members": {
          "parentDocument": {
            "shape": "DocumentType"
          }
        }
      },
      "DocumentType": {
        "type": "structure",
        "document": true
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "parentDocument": {
            "childDocument1": {
              "foo": "test"
            },
            "childDocument2": {
              "bar": true
            },
            "childDocument3": 123
          }
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"parentDocument\": {\"childDocument1\": {\"foo\": \"test\"}, \"childDocument2\": {\"bar\": true}, \"childDocument3\": 123}}"
        },
        "description": "legacy json Serialize aggregate documents in a JSON response 1"
      },
      {
        "given": {
          "output": {
            "shape": "OutputShape"
          },
          "name": "OperationName"
        },
        "result": {
          "parentDocument": [
            {
              "foo": "test"
            },
            {
              "bar": true
            },
            123
          ]
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"parentDocument\": [{\"foo\": \"test\"}, {\"bar\": true}, 123]}"
        },
        "description": "legacy json Serialize aggregate documents in a JSON response 2"
      }
    ]
  },
  {
    "description": "Ignores an unrecognized __type property",
    "metadata": {
      "protocol": "json"
    },
    "shapes": {
      "AllTypesUnionStructure": {
        "type": "structure",
        "union": true,
        "members": {
          "StringMember": {
            "shape": "String"
          },
          "UnionMember": {
            "shape": "AllTypesUnionStructure"
          }
        }
      },
      "String": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "output": {
            "shape": "AllTypesUnionStructure"
          },
          "name": "OperationName"
        },
        "result": {
          "UnionMember": {
            "StringMember": "foobar"
          }
        },
        "response": {
          "status_code": 200,
          "headers": {},
          "body": "{\"UnionMember\": {\"StringMember\":\"foobar\", \"__type\": \"aws.protocoltests.json10#MyUnion\"}}"
        },
        "description": "legacy json Ignores an unrecognized __type property"
      }
    ]
  }
]
