From d556f500a6d969764a58e0a0786ed3469d0bb614 Mon Sep 17 00:00:00 2001 From: treeform Date: Tue, 10 Mar 2026 07:42:51 -0700 Subject: [PATCH 1/3] fix duplicate discriminator field in object variants Made-with: Cursor --- src/jsony.nim | 16 +++++++++++++++- tests/test_objects.nim | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/jsony.nim b/src/jsony.nim index da3c165..3cd5ab5 100644 --- a/src/jsony.nim +++ b/src/jsony.nim @@ -477,7 +477,21 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) = new(v) break i = saveI - parseObjectInner(s, i, v) + when v.isObjectVariant: + # Object variant, check for duplicate discriminator field. + # -d:release has different behavior. + when defined(release): + let discBefore = v.discriminatorField + parseObjectInner(s, i, v) + if v.discriminatorField != discBefore: + error("Duplicate discriminator field with conflicting value.", i) + else: + try: + parseObjectInner(s, i, v) + except FieldDefect: + error("Duplicate discriminator field with conflicting value.", i) + else: + parseObjectInner(s, i, v) eatChar(s, i, '}') proc parseHook*[T](s: string, i: var int, v: var Option[T]) = diff --git a/tests/test_objects.nim b/tests/test_objects.nim index b6ff01d..d1eb34a 100644 --- a/tests/test_objects.nim +++ b/tests/test_objects.nim @@ -282,6 +282,29 @@ block: doAssert c.kind == nkFloat doAssert d.kind == nkInt + +block: + # Duplicate discriminator with a conflicting value raises JsonError. + var raised = false + try: + discard """{"kind":"nkFloat","floatVal":3.14,"kind":"nkInt"}""".fromJson( + ValueNode) + except JsonError: + raised = true + doAssert raised, + "expected JsonError for conflicting duplicate discriminator" + +block: + # Same test for ref object variant. + var raised = false + try: + discard """{"kind":"nkFloat","floatVal":3.14,"kind":"nkInt"}""".fromJson( + RefNode) + except JsonError: + raised = true + doAssert raised, + "expected JsonError for conflicting duplicate discriminator" + # test https://forum.nim-lang.org/t/7619 import jsony From 9080a01985808e7dd59faf6a3f5384d5ff8f2bad Mon Sep 17 00:00:00 2001 From: treeform Date: Tue, 10 Mar 2026 07:44:11 -0700 Subject: [PATCH 2/3] f --- src/jsony.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jsony.nim b/src/jsony.nim index 3cd5ab5..b29d95f 100644 --- a/src/jsony.nim +++ b/src/jsony.nim @@ -484,12 +484,12 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) = let discBefore = v.discriminatorField parseObjectInner(s, i, v) if v.discriminatorField != discBefore: - error("Duplicate discriminator field with conflicting value.", i) + error("Duplicate discriminator field.", i) else: try: parseObjectInner(s, i, v) except FieldDefect: - error("Duplicate discriminator field with conflicting value.", i) + error("Duplicate discriminator field.", i) else: parseObjectInner(s, i, v) eatChar(s, i, '}') From 98fbb650ce57d68d1f13f66ce9a6065ebed9f0de Mon Sep 17 00:00:00 2001 From: treeform Date: Tue, 10 Mar 2026 08:03:16 -0700 Subject: [PATCH 3/3] support older versions --- src/jsony.nim | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/jsony.nim b/src/jsony.nim index b29d95f..4621185 100644 --- a/src/jsony.nim +++ b/src/jsony.nim @@ -480,16 +480,13 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) = when v.isObjectVariant: # Object variant, check for duplicate discriminator field. # -d:release has different behavior. - when defined(release): - let discBefore = v.discriminatorField + let discBefore = v.discriminatorField + try: parseObjectInner(s, i, v) - if v.discriminatorField != discBefore: - error("Duplicate discriminator field.", i) - else: - try: - parseObjectInner(s, i, v) - except FieldDefect: - error("Duplicate discriminator field.", i) + except FieldDefect: + error("Duplicate discriminator field.", i) + if v.discriminatorField != discBefore: + error("Duplicate discriminator field.", i) else: parseObjectInner(s, i, v) eatChar(s, i, '}')