From 37e35bd435807939d5e666a6b03993aeaea3aeb8 Mon Sep 17 00:00:00 2001 From: Rupayon Haldar <80724680+rupayon123@users.noreply.github.com> Date: Sat, 26 Sep 2026 02:42:21 -0400 Subject: [PATCH] Preserve JSON scalar types on text nodes --- node.go | 2 +- node_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/node.go b/node.go index 53f212d..62d0425 100644 --- a/node.go +++ b/node.go @@ -182,7 +182,7 @@ func parseValue(x interface{}, top *Node, level int) { } default: // JSON types: string, number, boolean - n := &Node{Data: fmt.Sprintf("%v", v), Type: TextNode, level: level, value: fmt.Sprintf("%v", v)} + n := &Node{Data: fmt.Sprintf("%v", v), Type: TextNode, level: level, value: v} addNode(n) } } diff --git a/node_test.go b/node_test.go index f4b968a..cc1fb1f 100644 --- a/node_test.go +++ b/node_test.go @@ -63,6 +63,34 @@ func TestParseJsonObject(t *testing.T) { } } +func TestTextNodeValuePreservesJSONType(t *testing.T) { + doc, err := parseString(`{"count": 12, "enabled": true, "name": "sensor"}`) + if err != nil { + t.Fatal(err) + } + for _, tc := range []struct { + name string + value interface{} + text string + }{ + {"count", float64(12), "12"}, + {"enabled", true, "true"}, + {"name", "sensor", "sensor"}, + } { + parent := doc.SelectElement(tc.name) + if parent == nil || parent.FirstChild == nil || parent.FirstChild.Type != TextNode { + t.Fatalf("missing text node for %s", tc.name) + } + child := parent.FirstChild + if got := child.Value(); !reflect.DeepEqual(got, tc.value) { + t.Errorf("%s text value = %v (%T), want %v (%T)", tc.name, got, got, tc.value, tc.value) + } + if child.Data != tc.text || parent.InnerText() != tc.text { + t.Errorf("%s rendered text changed: data=%q inner=%q", tc.name, child.Data, parent.InnerText()) + } + } +} + func TestParseJsonObjectArray(t *testing.T) { s := `[ {"models":[ "Fiesta", "Focus", "Mustang" ] }