///|
/// JSON 访问小工具。核心 json 包以 prelude 形式导出类型与构造子,
/// 这里统一用模式匹配读取,避免 deprecated accessor。
pub fn json_as_object(j : Json) -> Map[String, Json]? {
match j {
Object(m) => Some(m)
_ => None
}
}
///|
pub fn json_as_array(j : Json) -> Array[Json]? {
match j {
Array(a) => Some(a)
_ => None
}
}
///|
pub fn json_as_string(j : Json) -> String? {
match j {
String(s) => Some(s)
_ => None
}
}
///|
pub fn json_as_double(j : Json) -> Double? {
match j {
Number(n, repr=_) => Some(n)
_ => None
}
}
///|
pub fn json_as_int(j : Json) -> Int32? {
match j {
Number(n, repr=_) => Some(n.to_int())
_ => None
}
}
///|
pub fn json_as_int64(j : Json) -> Int64? {
match j {
Number(n, repr=_) => Some(n.to_int64())
_ => None
}
}
///|
pub fn json_as_bool(j : Json) -> Bool? {
match j {
True => Some(true)
False => Some(false)
_ => None
}
}
///|
/// 读取对象字段
pub fn json_field(j : Json, key : String) -> Json? {
match json_as_object(j) {
Some(m) => m.get(key)
None => None
}
}
///|
/// 读取对象字段为字符串
pub fn json_field_string(j : Json, key : String) -> String? {
match json_field(j, key) {
Some(v) => json_as_string(v)
None => None
}
}
///|
/// 读取对象字段为 Int64
pub fn json_field_int64(j : Json, key : String) -> Int64? {
match json_field(j, key) {
Some(v) => json_as_int64(v)
None => None
}
}
///|
/// 读取对象字段为 Int
pub fn json_field_int(j : Json, key : String) -> Int32? {
match json_field(j, key) {
Some(v) => json_as_int(v)
None => None
}
}
///|
/// 读取对象字段为 Bool
pub fn json_field_bool(j : Json, key : String) -> Bool? {
match json_field(j, key) {
Some(v) => json_as_bool(v)
None => None
}
}
///|
/// 读取对象字段为数组
pub fn json_field_array(j : Json, key : String) -> Array[Json]? {
match json_field(j, key) {
Some(v) => json_as_array(v)
None => None
}
}
///|
/// JSON 对象 → (key, value-string) 列表(用于 partitionValues / configuration)
pub fn json_object_pairs_string(j : Json) -> Array[(String, String)] {
let out : Array[(String, String)] = []
match json_as_object(j) {
Some(m) =>
for k, v in m {
match json_as_string(v) {
Some(s) => out.push((k, s))
None =>
match json_as_double(v) {
Some(d) => out.push((k, d.to_string()))
None => ()
}
}
}
None => ()
}
out
}