diff --git a/Cargo.lock b/Cargo.lock
index 119d39d..6f6dc0f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -258,6 +258,12 @@ version = "1.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
 
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
 [[package]]
 name = "errno"
 version = "0.3.10"
@@ -292,6 +298,12 @@ version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
 
+[[package]]
+name = "hashbrown"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+
 [[package]]
 name = "hermit-abi"
 version = "0.3.9"
@@ -327,6 +339,16 @@ dependencies = [
  "cc",
 ]
 
+[[package]]
+name = "indexmap"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
 [[package]]
 name = "io-lifetimes"
 version = "1.0.11"
@@ -773,6 +795,7 @@ version = "1.0.138"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
 dependencies = [
+ "indexmap",
  "itoa",
  "memchr",
  "ryu",
diff --git a/Cargo.toml b/Cargo.toml
index d5520b2..0bf6d25 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -51,7 +51,7 @@ phf_codegen = "0.11.2"
 rand = { version = "0.9.0", features = ["small_rng"] }
 regex = "1.10.2"
 serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0.122"
+serde_json = { version = "1.0.122", features = ["preserve_order"] }
 sysinfo = "0.33"
 tempfile = "3.9.0"
 textwrap = { version = "0.16.0", features = ["terminal_size"] }
diff --git a/src/uu/lsmem/src/lsmem.rs b/src/uu/lsmem/src/lsmem.rs
index e0cfe78..b7f1d71 100644
--- a/src/uu/lsmem/src/lsmem.rs
+++ b/src/uu/lsmem/src/lsmem.rs
@@ -238,11 +238,6 @@ impl TableRow {
     }
 }
 
-#[derive(Serialize)]
-struct TableRowJson {
-    memory: Vec<TableRow>,
-}
-
 struct Options {
     // Set by command-line arguments
     all: bool,
@@ -575,9 +570,21 @@ fn print_table(lsmem: &Lsmem, opts: &Options) {
 }
 
 fn print_json(lsmem: &Lsmem, opts: &Options) {
-    let table_json = TableRowJson {
-        memory: create_table_rows(lsmem, opts),
-    };
+    let table_rows = create_table_rows(lsmem, opts);
+    let mut memory_records = Vec::new();
+
+    for row in table_rows {
+        let mut record = serde_json::Map::new();
+        for column in &opts.columns {
+            record.insert(
+                column.get_name().to_lowercase(),
+                serde_json::Value::String(row.get_value(column)),
+            );
+        }
+        memory_records.push(serde_json::Value::Object(record));
+    }
+
+    let table_json = serde_json::json!({ "memory": memory_records });
 
     let mut table_json_string = serde_json::to_string_pretty(&table_json)
         .unwrap()
diff --git a/tests/by-util/test_lsmem.rs b/tests/by-util/test_lsmem.rs
index cab51d0..5cbaa61 100644
--- a/tests/by-util/test_lsmem.rs
+++ b/tests/by-util/test_lsmem.rs
@@ -26,14 +26,13 @@ fn test_invalid_arg() {
     new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
 }
 
-// FAILS, COMMENT FOR NOW - TODO
-// #[test]
-// fn test_columns_json() {
-//     sysroot_test_with_args(
-//         "test_lsmem_columns_json.expected",
-//         &["-o", "block,size", "-J"],
-//     );
-// }
+#[test]
+fn test_columns_json() {
+    sysroot_test_with_args(
+        "test_lsmem_columns_json.expected",
+        &["-o", "block,size", "-J"],
+    );
+}
 
 #[test]
 fn test_columns_pairs() {