Workflow parameter values are encoded in the following manner. Primitives such as ints, floats, and strs are encoded normally, as shown below.
{
  "str_param": "this is a string parameter",
  "int_param": 12,
  "float_param": 3.45
}
Collection types like lists and dicts are also encoded normally, e.g.
{
  "list_of_str_param": ["a", "b"],
  "dict_str_int_param": {
    "c": 1,
    "d": 2
  }
}
Dataclasses are encoded the same as dicts, where field names become keys and field values become values. For example, the following dataclass definition and value
@dataclass
class A:
    f1: int
    f2: str

dataclass_param = A(1, "two")
would be encoded as
{
  "dataclass_param": {
    "f1": 1,
    "f2": "two"
  }
}
LatchFiles and LatchDirs are encoded as specially formatted /ldata strings. For example
{
  "file_param": "/ldata/123.account/hello.txt",
  "dir_param": "/ldata/123.account/fastq_dir"
}
See storage for more details. Lastly, Enum parameters are encoded as their value. For instance, the following definition and values
class Test(Enum):
    a = 1
    b = "two"

param_a = Test.a
param_b = Test.b
would be encoded as
{
  "param_a": 1,
  "param_b": "two"
}