/*
 * 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.json;

import java.io.Serializable;

/**
 * Base interface for all Json values.
 */
@Deprecated
public interface JsonValue extends Serializable {

  /**
   * Coerces underlying value to boolean according to the rules of Javascript coercion.
   */
  boolean asBoolean();

  /**
   * Coerces the underlying value to a number according to the rules of Javascript coercion.
   */
  double asNumber();

  /**
   * Coerces the underlying value to a String according to the rules of JavaScript coercion.
   */
  String asString();

  /**
   * Returns an enumeration representing the fundamental JSON type.
   */
  JsonType getType();

  /**
   * Returns a serialized JSON string representing this value.
   * @return
   */
  String toJson();

  /**
   * Equivalent of Javascript '==' operator comparison between two values.
   */
  boolean jsEquals(JsonValue value);


  /**
   * If used in a GWT context (dev or prod mode), converts the object to a native JavaScriptObject
   * suitable for passing to JSNI methods. Otherwise, returns the current object in other contexts,
   * such as server-side use.
   */
  Object toNative();
}
