diff --git a/lib/pure/json.nim b/lib/pure/json.nim index b3fc47749..1e408a223 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1608,7 +1608,11 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = result = processType(typeSym, obj, jsonNode) of nnkSym: let obj = getType(typeSym) - result = processType(typeSym, obj, jsonNode) + if obj.kind == nnkBracketExpr: + # When `Sym "Foo"` turns out to be a `ref object`. + result = createConstructor(obj, jsonNode) + else: + result = processType(typeSym, obj, jsonNode) else: doAssert false, "Unable to create constructor for: " & $typeSym.kind diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index 74b0d4dc3..f8ecd4637 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -159,11 +159,11 @@ when isMainModule: name: string age: int - Data = object + Data1 = object # TODO: Codegen bug when changed to ``Data``. person: Person list: seq[int] - var data = to(jsonNode, Data) + var data = to(jsonNode, Data1) doAssert data.person.name == "Nimmer" doAssert data.person.age == 21 doAssert data.list == @[1, 2, 3, 4] @@ -182,4 +182,30 @@ when isMainModule: } var result = to(node, TestEnum) - doAssert result.field == Bar \ No newline at end of file + doAssert result.field == Bar + + # Test ref type in field. + block: + let jsonNode = parseJson(""" + { + "person": { + "name": "Nimmer", + "age": 21 + }, + "list": [1, 2, 3, 4] + } + """) + + type + Person = ref object + name: string + age: int + + Data = object + person: Person + list: seq[int] + + var data = to(jsonNode, Data) + doAssert data.person.name == "Nimmer" + doAssert data.person.age == 21 + doAssert data.list == @[1, 2, 3, 4] \ No newline at end of file