Unfortunately I don't have a good suggestion right now. You can force Test::Deep to use stringwise comparison using str() but that'll only be useful you're constructing one side by hand. In your case both sides are constructed by things out of your control.
Just in case you, Test::More::is_deeply considers undef and "" to be equal but I assume since you're using Test::Deep, Test::More::is_deeply is not suitable.
You could do something a little drastic - intercept all the values and convert undef to "". Something like (untested)
(7)
]
