/*
 * Copyright 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package elemental.js.util;

import com.google.gwt.core.client.JavaScriptObject;

/**
 * A static API to the browser's JSON object.
 * TODO(knorton) : Remove this when generated DOM bindings are submitted. 
 */
@Deprecated
public class Json {
  /**
   * Parse a string containing JSON into a {@link JavaScriptObject}.
   *
   * @param <T> the overlay type to expect from the parse
   * @param jsonAsString
   * @return a JavaScript object constructed from the parse
   */
  public native static <T extends JavaScriptObject> T parse(String jsonAsString) /*-{
    return JSON.parse(jsonAsString);
  }-*/;

  /**
   * Convert a {@link JavaScriptObject} into a string representation.
   *
   * @param json a JavaScript object to be converted to a string
   * @return JSON in string representation
   */
  public native static String stringify(JavaScriptObject json) /*-{
    return JSON.stringify(json);
  }-*/;

  private Json() {
  }
}
