public AudioCodecOptions unmarshall(JsonUnmarshallerContext context) throws Exception {
    AudioCodecOptions audioCodecOptions = new AudioCodecOptions();

    int originalDepth = context.getCurrentDepth();
    String currentParentElement = context.getCurrentParentElement();
    int targetDepth = originalDepth + 1;

    JsonToken token = context.currentToken;
    if (token == null) token = context.nextToken();
    if (token == VALUE_NULL) return null;

    while (true) {
      if (token == null) break;

      if (token == FIELD_NAME || token == START_OBJECT) {
        if (context.testExpression("Profile", targetDepth)) {
          context.nextToken();
          audioCodecOptions.setProfile(StringJsonUnmarshaller.getInstance().unmarshall(context));
        }
      } else if (token == END_ARRAY || token == END_OBJECT) {
        if (context.getLastParsedParentElement() == null
            || context.getLastParsedParentElement().equals(currentParentElement)) {
          if (context.getCurrentDepth() <= originalDepth) break;
        }
      }

      token = context.nextToken();
    }

    return audioCodecOptions;
  }
  public Request<CreatePresetRequest> marshall(CreatePresetRequest createPresetRequest) {
    if (createPresetRequest == null) {
      throw new AmazonClientException("Invalid argument passed to marshall(...)");
    }

    Request<CreatePresetRequest> request =
        new DefaultRequest<CreatePresetRequest>(createPresetRequest, "AmazonElasticTranscoder");
    String target = "EtsCustomerService.CreatePreset";
    request.addHeader("X-Amz-Target", target);
    request.addHeader("Content-Type", "application/x-amz-json-1.0");

    request.setHttpMethod(HttpMethodName.POST);

    String uriResourcePath = "2012-09-25/presets";

    uriResourcePath = uriResourcePath.replaceAll("//", "/");

    if (uriResourcePath.contains("?")) {
      String queryString = uriResourcePath.substring(uriResourcePath.indexOf("?") + 1);
      uriResourcePath = uriResourcePath.substring(0, uriResourcePath.indexOf("?"));

      for (String s : queryString.split("[;&]")) {
        String[] nameValuePair = s.split("=");
        if (nameValuePair.length == 2) {
          request.addParameter(nameValuePair[0], nameValuePair[1]);
        } else {
          request.addParameter(s, null);
        }
      }
    }

    request.setResourcePath(uriResourcePath);

    try {
      StringWriter stringWriter = new StringWriter();
      JSONWriter jsonWriter = new JSONWriter(stringWriter);

      jsonWriter.object();

      if (createPresetRequest.getName() != null) {
        jsonWriter.key("Name").value(createPresetRequest.getName());
      }
      if (createPresetRequest.getDescription() != null) {
        jsonWriter.key("Description").value(createPresetRequest.getDescription());
      }
      if (createPresetRequest.getContainer() != null) {
        jsonWriter.key("Container").value(createPresetRequest.getContainer());
      }
      VideoParameters video = createPresetRequest.getVideo();
      if (video != null) {

        jsonWriter.key("Video");
        jsonWriter.object();

        if (video.getCodec() != null) {
          jsonWriter.key("Codec").value(video.getCodec());
        }
        if (video.getCodecOptions() != null) {
          jsonWriter.key("CodecOptions");
          jsonWriter.object();
          for (Map.Entry<String, String> codecOptionsListValue :
              video.getCodecOptions().entrySet()) {
            if (codecOptionsListValue.getValue() != null) {
              jsonWriter.key(codecOptionsListValue.getKey());

              jsonWriter.value(codecOptionsListValue.getValue());
            }
          }
          jsonWriter.endObject();
        }
        if (video.getKeyframesMaxDist() != null) {
          jsonWriter.key("KeyframesMaxDist").value(video.getKeyframesMaxDist());
        }
        if (video.getFixedGOP() != null) {
          jsonWriter.key("FixedGOP").value(video.getFixedGOP());
        }
        if (video.getBitRate() != null) {
          jsonWriter.key("BitRate").value(video.getBitRate());
        }
        if (video.getFrameRate() != null) {
          jsonWriter.key("FrameRate").value(video.getFrameRate());
        }
        if (video.getMaxFrameRate() != null) {
          jsonWriter.key("MaxFrameRate").value(video.getMaxFrameRate());
        }
        if (video.getResolution() != null) {
          jsonWriter.key("Resolution").value(video.getResolution());
        }
        if (video.getAspectRatio() != null) {
          jsonWriter.key("AspectRatio").value(video.getAspectRatio());
        }
        if (video.getMaxWidth() != null) {
          jsonWriter.key("MaxWidth").value(video.getMaxWidth());
        }
        if (video.getMaxHeight() != null) {
          jsonWriter.key("MaxHeight").value(video.getMaxHeight());
        }
        if (video.getDisplayAspectRatio() != null) {
          jsonWriter.key("DisplayAspectRatio").value(video.getDisplayAspectRatio());
        }
        if (video.getSizingPolicy() != null) {
          jsonWriter.key("SizingPolicy").value(video.getSizingPolicy());
        }
        if (video.getPaddingPolicy() != null) {
          jsonWriter.key("PaddingPolicy").value(video.getPaddingPolicy());
        }

        com.amazonaws.internal.ListWithAutoConstructFlag<PresetWatermark> watermarksList =
            (com.amazonaws.internal.ListWithAutoConstructFlag<PresetWatermark>)
                (video.getWatermarks());
        if (watermarksList != null
            && !(watermarksList.isAutoConstruct() && watermarksList.isEmpty())) {

          jsonWriter.key("Watermarks");
          jsonWriter.array();

          for (PresetWatermark watermarksListValue : watermarksList) {
            if (watermarksListValue != null) {
              jsonWriter.object();
              if (watermarksListValue.getId() != null) {
                jsonWriter.key("Id").value(watermarksListValue.getId());
              }
              if (watermarksListValue.getMaxWidth() != null) {
                jsonWriter.key("MaxWidth").value(watermarksListValue.getMaxWidth());
              }
              if (watermarksListValue.getMaxHeight() != null) {
                jsonWriter.key("MaxHeight").value(watermarksListValue.getMaxHeight());
              }
              if (watermarksListValue.getSizingPolicy() != null) {
                jsonWriter.key("SizingPolicy").value(watermarksListValue.getSizingPolicy());
              }
              if (watermarksListValue.getHorizontalAlign() != null) {
                jsonWriter.key("HorizontalAlign").value(watermarksListValue.getHorizontalAlign());
              }
              if (watermarksListValue.getHorizontalOffset() != null) {
                jsonWriter.key("HorizontalOffset").value(watermarksListValue.getHorizontalOffset());
              }
              if (watermarksListValue.getVerticalAlign() != null) {
                jsonWriter.key("VerticalAlign").value(watermarksListValue.getVerticalAlign());
              }
              if (watermarksListValue.getVerticalOffset() != null) {
                jsonWriter.key("VerticalOffset").value(watermarksListValue.getVerticalOffset());
              }
              if (watermarksListValue.getOpacity() != null) {
                jsonWriter.key("Opacity").value(watermarksListValue.getOpacity());
              }
              if (watermarksListValue.getTarget() != null) {
                jsonWriter.key("Target").value(watermarksListValue.getTarget());
              }
              jsonWriter.endObject();
            }
          }
          jsonWriter.endArray();
        }
        jsonWriter.endObject();
      }
      AudioParameters audio = createPresetRequest.getAudio();
      if (audio != null) {

        jsonWriter.key("Audio");
        jsonWriter.object();

        if (audio.getCodec() != null) {
          jsonWriter.key("Codec").value(audio.getCodec());
        }
        if (audio.getSampleRate() != null) {
          jsonWriter.key("SampleRate").value(audio.getSampleRate());
        }
        if (audio.getBitRate() != null) {
          jsonWriter.key("BitRate").value(audio.getBitRate());
        }
        if (audio.getChannels() != null) {
          jsonWriter.key("Channels").value(audio.getChannels());
        }
        AudioCodecOptions codecOptions = audio.getCodecOptions();
        if (codecOptions != null) {

          jsonWriter.key("CodecOptions");
          jsonWriter.object();

          if (codecOptions.getProfile() != null) {
            jsonWriter.key("Profile").value(codecOptions.getProfile());
          }
          jsonWriter.endObject();
        }
        jsonWriter.endObject();
      }
      Thumbnails thumbnails = createPresetRequest.getThumbnails();
      if (thumbnails != null) {

        jsonWriter.key("Thumbnails");
        jsonWriter.object();

        if (thumbnails.getFormat() != null) {
          jsonWriter.key("Format").value(thumbnails.getFormat());
        }
        if (thumbnails.getInterval() != null) {
          jsonWriter.key("Interval").value(thumbnails.getInterval());
        }
        if (thumbnails.getResolution() != null) {
          jsonWriter.key("Resolution").value(thumbnails.getResolution());
        }
        if (thumbnails.getAspectRatio() != null) {
          jsonWriter.key("AspectRatio").value(thumbnails.getAspectRatio());
        }
        if (thumbnails.getMaxWidth() != null) {
          jsonWriter.key("MaxWidth").value(thumbnails.getMaxWidth());
        }
        if (thumbnails.getMaxHeight() != null) {
          jsonWriter.key("MaxHeight").value(thumbnails.getMaxHeight());
        }
        if (thumbnails.getSizingPolicy() != null) {
          jsonWriter.key("SizingPolicy").value(thumbnails.getSizingPolicy());
        }
        if (thumbnails.getPaddingPolicy() != null) {
          jsonWriter.key("PaddingPolicy").value(thumbnails.getPaddingPolicy());
        }
        jsonWriter.endObject();
      }

      jsonWriter.endObject();

      String snippet = stringWriter.toString();
      byte[] content = snippet.getBytes("UTF-8");
      request.setContent(new StringInputStream(snippet));
      request.addHeader("Content-Length", Integer.toString(content.length));
    } catch (Throwable t) {
      throw new AmazonClientException("Unable to marshall request to JSON: " + t.getMessage(), t);
    }

    return request;
  }