I managed to get it to work with System.Text.Json after all, which did allow me to clean up the code quite a bit.
The deserializer now has a pre-processing stage that makes sure that the type discriminators are always first & that old-style "type" properties are upgraded to "resultTypeSpecifier".
Narrative is now fully supported in the format that is currently in the ELM produced by the Java stack
I managed to get it to work with System.Text.Json after all, which did allow me to clean up the code quite a bit.