/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You 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 javax.json;

import java.util.List;

public interface JsonArray extends JsonStructure, List<JsonValue> {
    JsonObject getJsonObject(int index);

    JsonArray getJsonArray(int index);

    JsonNumber getJsonNumber(int index);

    JsonString getJsonString(int index);

    <T extends JsonValue> List<T> getValuesAs(Class<T> clazz);

    String getString(int index);

    String getString(int index, String defaultValue);

    int getInt(int index);

    int getInt(int index, int defaultValue);

    boolean getBoolean(int index);

    boolean getBoolean(int index, boolean defaultValue);

    boolean isNull(int index);
}

