How interesting. So when you see
{ "a": <json1>, "b": <json2>, "c": <json3> }
you remember the positions of the start of the sub-trees, and then go back and validate-and-parse ? At first glance, to know where the sub-trees end, would seem to require at least parenthesis-matching of the entire subtree ? So either you keep that data-structure around (which amounts to a tree of a sort), or you have to re-scan subtrees (e.g. in the case where <json1> is itself an object ?
Just curious how you do it. Obviously, for some JSON Schema (we could call them “conjunctive” or non-backtracking) this isn’t necessary. And those schema aren’t so negligible: they include enough to be able to support constructor-datatypes.