Skip to content

More context for deserialization failures such as "Digit expected at beginning of number" #18

@vpanteleev-sym

Description

@vpanteleev-sym

If deserialization of a large object fails, the only information we have to go by is the error message. This makes it challenging to diagnose which part of the JSON object was not accepted by the program.

For example, I am dealing with the following error:

2025-07-06T18:53:21.986 [error] businesseventpoller.d:101:__foreachbody2 Encountered error: std.json.JSONException@/build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d(2713): Digit expected at beginning of number.
----------------
??:? [0x9cee86]
??:? [0x9ceaf2]
??:? [0x9f7bae]
??:? [0x9d7f9f]
nix/store/6nlrhnbn168zlqk8k8cq1q3cp18yqrbq-ldc-1.39.0-include/include/d/std/exception.d:522 [0x57c003]
nix/store/6nlrhnbn168zlqk8k8cq1q3cp18yqrbq-ldc-1.39.0-include/include/d/std/exception.d:442 [0x57bf05]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d:2821 [0x57bd2a]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d:2713 [0x57b922]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d:2691 [0x57b3ae]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d:2207 [0x58ab30]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:740 [0x58aaf8]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:704 [0x5864b8]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:938 [0x5851e5]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d:2148 [0x5848a6]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:913 [0x583d34]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:704 [0x583c68]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:813 [0x5a1fbc]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/json.d:2172 [0x5a1f25]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:809 [0x5a1de9]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:704 [0x5a1d98]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/data/serialization.d:310 [0x4ca8c8]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-d/web/vibe/web/common.d:572 [0x4ca887]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-d/web/vibe/web/rest.d:1992 [0x4ba397]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-serialization/source/vibe/internal/meta/codegen.d-mixin-301:304 [0x4b9c9c]
/build/source/my-team/business-app/source/business-app/eventpollers/businesseventpoller.d:116 [0x45a541]
/build/source/my-team/business-app/source/business-app/eventpollers/businesseventpoller.d:78 [0x46dae4]
nix/store/6nlrhnbn168zlqk8k8cq1q3cp18yqrbq-ldc-1.39.0-include/include/d/std/range/interfaces.d:489 [0x62cf0a]
/build/source/my-team/business-app/source/business-app/eventpollers/businesseventpoller.d:66 [0x46d5e4]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-core/source/vibe/core/core.d:1138 [0x90f3c3]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-core/source/vibe/core/core.d:1201 [0x90f580]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-core/source/vibe/core/task.d:813 [0x933634]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-core/source/vibe/core/task.d:832 [0x93121b]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-core/source/vibe/core/task.d:502 [0x930a39]
build/de6fb314a2297aca2e4e840e2079c266b9ead6afb78f23677ba44c52f4c72a93/vibe-core/source/vibe/core/task.d:411 [0x9303e8]
??:? [0x9cfee2]

It's not quite obvious how to discover the source of the problem from the above.

Some ways we can improve:

  • When deserializing objects and arrays, include the path to the respective field in the raised error message.
  • If the problem concerns a specific value, include that value in the raised error message.
  • We can also include a fragment of the problematic JSON at the respective position (e.g. it could be the surrounding 20 characters).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions