-
-
Notifications
You must be signed in to change notification settings - Fork 848
Open
Description
Context
json.unmarshal seems to be ignoring alternative structs in a union, because if it doesn't find the fields it's looking for on the first struct variant it tries, it parses it as any value, skipping the other possibilities.
Odin/core/encoding/json/unmarshal.odin
Lines 461 to 474 in 5b6c96c
| } else { | |
| // allows skipping unused struct fields | |
| // NOTE(bill): prevent possible memory leak if a string is unquoted | |
| allocator := p.allocator | |
| defer p.allocator = allocator | |
| p.allocator = mem.nil_allocator() | |
| parse_value(p) or_return | |
| if parse_comma(p) { | |
| break struct_loop | |
| } | |
| continue struct_loop | |
| } |
Odin: dev-2024-04:2416380f3
OS: Arch Linux, Linux 6.8.7-arch1-1
CPU: 12th Gen Intel(R) Core(TM) i7-12700K
RAM: 31916 MiB
Backend: LLVM 14.0.6
Expected Behavior
JSON unmarshalling to B instead of A, or some sort of error/advisory/workaround.
Current Behavior
Invalid type assertion from U to B, actual type: A
Failure Information (for bugs)
Steps to Reproduce
package main
import "core:encoding/json"
A :: struct {
a: int,
}
B :: struct {
b: string,
}
U :: union {
rawptr,
A,
B,
}
main :: proc() {
u: U
error := json.unmarshal_string(`{"b": "Hellope"}`, &u)
assert(error == nil)
assert(u.(B).b == "Hellope")
}dozn
Metadata
Metadata
Assignees
Labels
No labels