mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
Fixes #5761.
This commit is contained in:
@@ -1608,7 +1608,7 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
|
||||
result = processType(newIdentNode(typeName), obj, jsonNode, true)
|
||||
of "seq":
|
||||
let seqT = typeSym[1]
|
||||
let forLoopI = newIdentNode("i")
|
||||
let forLoopI = genSym(nskForVar, "i")
|
||||
let indexerNode = createJsonIndexer(jsonNode, forLoopI)
|
||||
let constructorNode = createConstructor(seqT, indexerNode)
|
||||
|
||||
@@ -1616,12 +1616,25 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
|
||||
result = quote do:
|
||||
(
|
||||
var list: `typeSym` = @[];
|
||||
# if `jsonNode`.kind != JArray:
|
||||
# # TODO: Improve error message.
|
||||
# raise newException(ValueError, "Expected a list")
|
||||
verifyJsonKind(`jsonNode`, {JArray}, astToStr(`jsonNode`));
|
||||
for `forLoopI` in 0 .. <`jsonNode`.len: list.add(`constructorNode`);
|
||||
list
|
||||
)
|
||||
of "array":
|
||||
let arrayT = typeSym[2]
|
||||
let forLoopI = genSym(nskForVar, "i")
|
||||
let indexerNode = createJsonIndexer(jsonNode, forLoopI)
|
||||
let constructorNode = createConstructor(arrayT, indexerNode)
|
||||
|
||||
# Create a statement expression containing a for loop.
|
||||
result = quote do:
|
||||
(
|
||||
var list: `typeSym`;
|
||||
verifyJsonKind(`jsonNode`, {JArray}, astToStr(`jsonNode`));
|
||||
for `forLoopI` in 0 .. <`jsonNode`.len: list[`forLoopI`] =`constructorNode`;
|
||||
list
|
||||
)
|
||||
|
||||
else:
|
||||
# Generic type.
|
||||
let obj = getType(typeSym)
|
||||
|
||||
@@ -226,4 +226,24 @@ when isMainModule:
|
||||
|
||||
let x = parseJson("""{ "field": 5}""")
|
||||
let data = to(x, FooBar)
|
||||
doAssert data.field == 5.0
|
||||
doAssert data.field == 5.0
|
||||
|
||||
block:
|
||||
type
|
||||
BirdColor = object
|
||||
name: string
|
||||
rgb: array[3, float]
|
||||
|
||||
type
|
||||
Bird = object
|
||||
age: int
|
||||
height: float
|
||||
name: string
|
||||
colors: array[2, BirdColor]
|
||||
|
||||
var red = BirdColor(name: "red", rgb: [1.0, 0.0, 0.0])
|
||||
var blue = Birdcolor(name: "blue", rgb: [0.0, 0.0, 1.0])
|
||||
var b = Bird(age: 3, height: 1.734, name: "bardo", colors: [red, blue])
|
||||
let jnode = %b
|
||||
let data = jnode.to(Bird)
|
||||
doAssert data == b
|
||||
Reference in New Issue
Block a user