The problem with turning this into template is that then you have to define the generic template in thee body, and all the specializations after the class. In the case of things like the 'Array' case, if you want people to be able to resolve that fully ('Get me a vector<int>'), you have to use a helper class so you can do the template partial specialization (You can't partially-specialize function templates). I just did this for a configuration class and I don't think it's worthwhile here.

As far as modification goes, I think it's better in some ways to force people to modify via making another TJson object and assigning rather than modifying the values in place. As it is that TJson::operator[] will __sometimes__ create a new entry, and other times hard assert fail if the index doesn't exist is hard behavior to program around / work with (I have to follow through the const and make sure I'm using it right). That particular problem is why I added Contains as a manual check.

The Getters are mainly just so I can retrieve the data without having to write a full visitor (The class didn't have any way of getting the data out, just iterating over the data if it was an object or array, setting the data, and read/write to a string).