diff --git a/Cargo.lock b/Cargo.lock index c737e2c66..bcb3241b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1588,6 +1588,7 @@ dependencies = [ "regex", "serde", "serde_derive", + "serde_json", "termbg", "tokio", "toml", diff --git a/Cargo.toml b/Cargo.toml index d1eb3b6e8..175140eab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ minus = { version = "5.7", features = ["static_output", "search"] } once_cell = "1.21.4" serde = "1.0" serde_derive = "1.0" +serde_json = "1.0" termbg = "0.6.2" tokio = { version = "1.52", optional = true, features = ["rt"] } toml = "1.1" diff --git a/src/column.rs b/src/column.rs index 87b019b5a..3ec8920fb 100644 --- a/src/column.rs +++ b/src/column.rs @@ -106,7 +106,8 @@ macro_rules! column_default_display_json { let value = value.replace("\"", "\\\""); format!("\"{}\"", value) }; - format!("\"{}\": {}", self.header, value) + let header = serde_json::to_string(&self.header).unwrap(); + format!("{}: {}", header, value) } }; } diff --git a/src/columns/pid.rs b/src/columns/pid.rs index 512d64ffd..1f304554e 100644 --- a/src/columns/pid.rs +++ b/src/columns/pid.rs @@ -25,6 +25,23 @@ impl Pid { } } +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn json_escapes_custom_header() { + for header in ["PID", "Process \"ID\"", "Path\\ID", "Process\nID", "Process\tID"] { + let mut column = Pid::new(Some(header.into())); + column.raw_contents.insert(201, 201); + column.fmt_contents.insert(201, "201".into()); + let json = format!("{{{}}}", column.display_json(201)); + let row: serde_json::Value = serde_json::from_str(&json).unwrap(); + assert_eq!(row[header], 201); + } + } +} + #[cfg(any(target_os = "linux", target_os = "android"))] impl Column for Pid { fn add(&mut self, proc: &ProcessInfo) {