component-model icon indicating copy to clipboard operation
component-model copied to clipboard

How to define the json object

Open oovm opened this issue 1 year ago • 2 comments

I want to define a json structure to provide serialization and deserialization capabilities, but I encountered two problems.

  1. No mapping of dictionary type
  2. 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
          |               ^----

oovm avatar Apr 09 '24 07:04 oovm

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>).

lukewagner avatar Apr 09 '24 23:04 lukewagner

Also related to https://github.com/WebAssembly/component-model/issues/125

yordis avatar Jul 28 '25 23:07 yordis