(Pre-existing) The handling of first and second just unrolls one cycle of this loop, except for which things get destroyed; and I'm initially confused about why what gets destroyed.  After a bit of thought, I make sense of the latter; the JsonDestroy(result) would benefit from a comment saying `/* not in containers, so need overt delete */`.
Having worked that out, I now see why the first iteration of the loop is effectively unrolled before the loop.

I would be inclined to skip the variables first, second and cur; just inline the relevant SeqAt() in the one place each is used.  This would make the difference in result's status more overt; all but one return of JsonMerge() gets destroyed.