Outputting JSON is much easier than you think:

 class MyClass : MyInterface {
   Json emit_json() {
     Json j = Json.emptyObject;
     j.foo = "123";
     j.bar = "456";
     j.quxx = "789";
     return j;
   }
 }

I don't think there is any need to define the functions as properties either.

As for you last example, is it not returning valid JSON? It's simply being escaped because you are outputting the string to the screen and it's being escaped for display purposes. Json.toString() definitely outputs a JSON string that's ready for consumption by a parser.