** (Service) - ** A one-stop shop for all your JSON mapping needs!@Jsconstmixin Json {** Creates a new 'Json' instance with the given inspectors.staticnew make(JsonTypeInspectors inspectors := JsonTypeInspectors()){ JsonImpl(inspectors, JsonReader(), JsonWriter())}** Returns the underlying 'JsonTypeInspectors'. abstract JsonTypeInspectors inspectors()** Converts the given entity to JSON.** ** If 'fantomType' is 'null' it defaults to the type of the given obj.abstract Str writeEntity(Obj? fantomObj, Type? fantomType := null)** Reads the the given JSON and converts it to a Fantom entity instance.abstract Obj? readEntity(Str? json, Type fantomType)}@Jsinternalconstclass JsonImpl : Json {overrideconst JsonTypeInspectors inspectorsprivateconst JsonReader jsonReaderprivateconst JsonWriter jsonWriternew make(JsonTypeInspectors inspectors, JsonReader jsonReader, JsonWriter jsonWriter){this.inspectors = inspectorsthis.jsonReader = jsonReaderthis.jsonWriter = jsonWriter}override Str writeEntity(Obj? fantomObj, Type? fantomType := null){ jsonObj := inspectors.toJsonObj(fantomObj, fantomType) json := jsonWriter.writeObj(jsonObj)return json}override Obj? readEntity(Str? json, Type fantomType){ jsonObj := jsonReader.readObj(json) entity := inspectors.toFantom(jsonObj, fantomType)return entity}}