You can now serialize TObjectList
instances, after a proper
call to TJSONSerializer.RegisterClassForJSON()
method.
In fact, if ObjectToJSON()
or
TJSONWriter.WriteObject()
have their woStoreClassName
option defined, a new "ClassName":
field will be written as first
field of the serialized JSON object.
This new "ClassName"
field will be recognized:
- by
JSONToObject()
forTObjectList
members, - and by the new
JSONToNewObject()
method.
Note that all TSQLRecord
classes of a model are automatically
registered via a call to TJSONSerializer.RegisterClassForJSON()
:
you do not have to register them, and can directly serialize
TObjectList
of TSQLRecord
s.
As a consequence, this kind of code can now work:
// register the type (but Classes.RegisterClass list is also checked) TJSONSerializer.RegisterClassForJSON([TComplexNumber]); // create an instance by reading the textual class name field J := '{"ClassName":"TComplexNumber", "Real": 10.3, "Imaginary": 7.92 }'; P := @J[1]; // make local copy of constant Comp := TComplexNumber(JSONToNewObject(P,Valid)); // here Comp is a valid unserialized object Check(Valid); Check(Comp.ClassType=TComplexNumber); CheckSame(Comp.Real,10.3); CheckSame(Comp.Imaginary,7.92); // do not forget to free the memory (Comp can be nill if JSON was not valid) Comp.Free;
Internal TObjectList
process will therefore rely on a similar
process, creating the proper class instances on the fly. You can even have
several classes appearing in one TObjectList
: the only
prerequisite is that all class types shall have been previously registered on
both sides, by a call to
TJSONSerializer.RegisterClassForJSON()
.
Feedback is welcome on our forum.