How to define the json object
I want to define a json structure to provide serialization and deserialization capabilities, but I encountered two problems.
- No mapping of dictionary type
- Unable to define recursive types (direct or indirect)
package endec: [email protected];
world imports {
export types;
}
interface types {
/// The json value context
record json {
/// The root value
root: value
}
/// A json value
variant value {
%null,
%bool(bool),
%decimal(f64),
%string(string),
%array(array),
%object(object)
}
/// A json array
record array {
%list: list<value>,
}
/// A json object
record object {
%dict: list<tuple<string, value>>,
}
}
Such a definition will report an error:
called `Result::unwrap()` on an `Err` value: failed to parse package: C:\Users\CLionProjects\serde-wasi\projects\serde-json\wit
Caused by:
type `value` depends on itself
--> C:\Users\CLionProjects\serde-wasi\projects\serde-json\wit\world.wit:11:15
|
11 | root: value
| ^----
Currently value types are not allowed to be recursive, which is the root problem here. It's definitely valuable and tracked as a future feature in #56, it's just a ton of effort and complexity so we were planning to postpone it until after the 1.0/MVP. Until then, the best approximation is to define JSON via resource types (which admittedly isn't very efficient due to the function call overhead, so you might also just want to pass JSON as a string or BSON list<u8>).
Also related to https://github.com/WebAssembly/component-model/issues/125