b315eb18创建于 2025年11月10日历史提交
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
package cjjson

// 扩展JsonKind
public interface IJsonKindExtend {
    func toString(): String
    operator func ==(right: JsonKind): Bool
    operator func !=(right: JsonKind): Bool
}

extend JsonKind <: IJsonKindExtend {
    // 返回JsonKind对应的名字
    public func toString(): String {
        match (this) {
            case JsonKind.JsArray => "JSON Array"
            case JsonKind.JsBool => "JSON Bool"
            case JsonKind.JsFloat => "JSON Float"
            case JsonKind.JsInt => "JSON Int"
            case JsonKind.JsNull => "JSON null"
            case JsonKind.JsObject => "JSON Object"
            case JsonKind.JsString => "JSON String"
        }
    }

    // 操作符重载,支持JsonKind判等
    public operator func ==(right: JsonKind): Bool {
        match ((this, right)) {
            case (JsonKind.JsArray, JsonKind.JsArray) => return true
            case (JsonKind.JsBool, JsonKind.JsBool) => return true
            case (JsonKind.JsFloat, JsonKind.JsFloat) => return true
            case (JsonKind.JsInt, JsonKind.JsInt) => return true
            case (JsonKind.JsNull, JsonKind.JsNull) => return true
            case (JsonKind.JsObject, JsonKind.JsObject) => return true
            case (JsonKind.JsString, JsonKind.JsString) => return true
            case _ => return false
        }
    }

    // 操作符重载,支持JsonKind判不等
    public operator func !=(right: JsonKind): Bool {
        return !(this == right)
    }
}

// 扩展JsonValue
public interface IJsonValueExtend {
    // 判断JsonValue的类型
    func isBool(): Bool
    func isInt(): Bool
    func isFloat(): Bool
    func isString(): Bool
    func isObject(): Bool
    func isArray(): Bool
    func isNull(): Bool

    // 为JSON Object类型提供一系列简易的set方法,如果当前不是JSON Object类型,则写入失败,返回false。
    func setBoolValue(key: String, value: Bool): Bool
    func setIntValue(key: String, value: Int64): Bool
    func setFloatValue(key: String, value: Float64): Bool
    func setStringValue(key: String, value: String): Bool
    func setObjectValue(key: String, value: JsonObject): Bool
    func setArrayValue(key: String, value: Array<JsonValue>): Bool
    func setNullValue(key: String): Bool
    func setJsonValue(key: String, value: JsonValue): Bool

    // 为JSON Object类型提供一系列简易的get方法,如果当前不是JSON Object类型,返回default默认值。
    func getBoolValue(key: String, default!: Bool, onException!: (Exception) -> Unit): Bool
    func getIntValue(key: String, default!: Int64, onException!: (Exception) -> Unit): Int64
    func getFloatValue(key: String, default!: Float64, onException!: (Exception) -> Unit): Float64
    func getStringValue(key: String, default!: String, onException!: (Exception) -> Unit): String
    func getArrayValue(key: String, default!: Array<JsonValue>, onException!: (Exception) -> Unit): Array<JsonValue>
    func getJsonObject(key: String, default!: JsonObject, onException!: (Exception) -> Unit): JsonObject
    func getJsonValue(key: String, default!: JsonValue, onException!: (Exception) -> Unit): JsonValue
}

let emptyHandler = {_: Exception =>}

extend JsonValue <: IJsonValueExtend {
    // 判断是否是 JSON Bool 类型
    public func isBool(): Bool {
        return this.kind() == JsonKind.JsBool
    }

    // 判断是否是 JSON Int 类型
    public func isInt(): Bool {
        return this.kind() == JsonKind.JsInt
    }

    // 判断是否是 JSON Float 类型
    public func isFloat(): Bool {
        return this.kind() == JsonKind.JsFloat
    }

    // 判断是否是 JSON String 类型
    public func isString(): Bool {
        return this.kind() == JsonKind.JsString
    }

    // 判断是否是 JSON Object 类型
    public func isObject(): Bool {
        return this.kind() == JsonKind.JsObject
    }

    // 判断是否是 JSON Array 类型
    public func isArray(): Bool {
        return this.kind() == JsonKind.JsArray
    }

    // 判断是否是 JSON null
    public func isNull(): Bool {
        return this.kind() == JsonKind.JsNull
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 Bool 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setBoolValue(key: String, value: Bool): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, JsonBool(value))
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 Int64 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setIntValue(key: String, value: Int64): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, JsonInt(value))
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 Float64 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setFloatValue(key: String, value: Float64): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, JsonFloat(value))
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 String 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setStringValue(key: String, value: String): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, JsonString(value))
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 JsonObject 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setObjectValue(key: String, value: JsonObject): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, value)
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 Array<JsonValue> 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setArrayValue(key: String, value: Array<JsonValue>): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, JsonArray(value))
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setNullValue(key: String): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, JsonNull())
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 写入健值对。
     *
     * @param key 要写入的键名
     * @param value 要写入的 JsonValue 值
     * @return 写入成功返回 true,写入失败则返回 false
     * @attention 如果当前对象不是 JSON Object 类型,则写入失败。
     */
    public func setJsonValue(key: String, value: JsonValue): Bool {
        match (this) {
            case obj: JsonObject =>
                obj.put(key, value)
                return true
            case _ => return false
        }
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为 false。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 Bool 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getBoolValue(key: String, default!: Bool = false, onException!: (Exception) -> Unit = emptyHandler): Bool {
        try {
            return this.asObject().get(key)?.asBool().getValue() ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为 0。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 Int64 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getIntValue(key: String, default!: Int64 = 0, onException!: (Exception) -> Unit = emptyHandler): Int64 {
        try {
            return this.asObject().get(key)?.asInt().getValue() ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为 0.0。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 Float64 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getFloatValue(key: String, default!: Float64 = 0.0, onException!: (Exception) -> Unit = emptyHandler): Float64 {
        try {
            return this.asObject().get(key)?.asFloat().getValue() ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为空字符串。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 String 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getStringValue(key: String, default!: String = "", onException!: (Exception) -> Unit = emptyHandler): String {
        try {
            return this.asObject().get(key)?.asString().getValue() ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为空数组。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 Array<JsonValue> 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getArrayValue(key: String, default!: Array<JsonValue> = Array(),
        onException!: (Exception) -> Unit = emptyHandler): Array<JsonValue> {
        try {
            return this.asObject().get(key)?.asArray().getItems().toArray() ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为空数组。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 JsonObject 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getJsonObject(key: String, default!: JsonObject = JsonObject(),
        onException!: (Exception) -> Unit = emptyHandler): JsonObject {
        try {
            return this.asObject().get(key)?.asObject() ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }

    /**
     * JSON Object 读取键值对。
     *
     * @param key 要读取的键名
     * @param default 可选命名参数,默认值为空数组。当健名不存在,或对应的值类型不匹配时,返回此默认值。
     * @param onException 可选命名参数,默认值为空函数。当类型不匹配时,自定义如何处理该异常。
     * @return 健名对应的 JsonValue 值
     * @attention 如果当前对象不是 JSON Object 类型,则返回 default 值。
     */
    public func getJsonValue(key: String, default!: JsonValue = JsonNull(),
        onException!: (Exception) -> Unit = emptyHandler): JsonValue {
        try {
            return this.asObject().get(key) ?? default
        } catch (e: Exception) {
            onException(e)
        }
        return default
    }
}