On Tuesday, 20 July 2021 at 21:18:12 UTC, Bagomot wrote:

But there is a problem with different types. I understand that Object[] is not suitable here, but I don’t know how to do it.

I ask you to help me with this.

IIUC, the `arguments` are command line arguments passed to a Java program, and some of those might be passed to the JVM ?

So you probably will end up with something like:
```
struct Arguments{
    JVMArgs jvm;
    ProgramArgs program;
}
```

Of course, the question is, what's `JVMArgs` ?

Now, as you noticed, you can't represent an array of unrelated types in D (which makes sense). So what you can do is create a common type for it, by using an `union`.

```
union JVMArg
{
    RuleValue ruleValue;
    string str;
    // Etc...
}
alias JVMArgs = JVMArg[];
```

However, \<YOUR-JSON-LIBRARY> might not support it directly, or might support it through its own type (you will need a tagged union, and not just a simple union, as you need to know the type that the library read).

But if you take a step back, I think you might find this solution is far from ideal. Having worked on a JSON library myself, I can tell you they are all implemented with a tagged union. And converting a tagged union to a tagged union is no improvement.

Instead, I would recommend to just use the JSON directly. If you need to pass things around, you might want to deserialize it to a common format. For example, assuming your project is a process manager for Java program and you want to read a common set of arguments from a configuration file, you might want to just generate the strings:
```
auto myJSON = parseConfigFile("config.json");
string[] defaultJVMArgs = parseJVMArgs(myJSON);
auto processMonitor = new ProcessMonitor(defaultJVMArgs);
```

TL;DR: If you want to use loosely typed data in a strongly typed language, you need to come up with a common type. That common type is usually either a discriminated union (which a JSON object is, essentially) or something that is domain-specific.

Hope this helps. I had a quick look at asdf and couldn't see a support for tagged union, so you would probably need to provide your data structure with a `deserializeFromAsdf` method. If you want to do so, look into providing a wrapper to `SumType`, e.g.:

```
struct MyUnion (T...) {
    SumType!T data;
    alias data this;
SerdeException deserializeFromAsdf(Asdf data) { /* Fill in the SumType */ }
```

But I would recommend just using the JSON object if you can.

Reply via email to