Deserialising JSON with asdf when a field is unexpectedly null

Anonymouse zorael at gmail.com
Wed Apr 2 15:37:46 UTC 2025


I'm trying to replace my use of `std.json` with `asdf`.

I ran into an issue where some JSON I throw at it has fields that 
are sometimes null and sometimes not. I don't know how to tell 
asdf not to throw when deserialising it.

Minimal example:

```d
{
     "inner": {
         "s": "foo"
     }
}
```

This is the usual case, but sometimes the response is this.

```d
{
     "inner": null
}
```

asdf behaves like so:

```d
/+dub.sdl:
dependency "asdf" version="~>0.7.17"
+/
import asdf;

struct S
{
     static struct Inner
     {
         string s = "foo";
     }

     Inner inner;
}

void main()
{
     S foo;
     const good = foo.serializeToJson;
     assert(good == `{"inner":{"s":"foo"}}`);

     enum bad = `{"inner":null}`;
     auto bar = bad.deserialize!S;
}

/*
mir.serde.SerdeException at .dub/packages/asdf/0.7.17/asdf/source/asdf/serialization.d(338): Cann't deserialize Inner. Unexpected data: null_
*/
```

`asdf` has some UDAs that you can use to declare members and 
fields as optional, which works well when fields are omitted, but 
there doesn't seem to be something for when they're *there* but 
unexpectedly null. There is a `@serdeTransformIn` that I had 
hoped could maybe work to treat null as `Inner.init`, but the 
docs were lacking and I couldn't get it to work.

What should I do? I don't want to just catch the exception but so 
far that's the best solution I have.




More information about the Digitalmars-d-learn mailing list