Neon is a serialization library for Delphi that helps you to convert (back and forth) objects and other values to JSON. It supports simple Delphi types but also complex class and records. Neon has been designed with REST in mind, to exchange pure data between applications with no "metadata" or added fields, in fact Neon is the default JSON serialization engine for the WiRL REST Library.
Please take a look at the Demos to see Neon in action.
Extensive configuration through INeonConfiguration
interface:
- Word case (UPPERCASE, lowercase, PascalCase, camelCase, snake_case)
- CuStOM CAse (through anonymous method)
- Member types (Fields, Properties)
- Option to ignore the "F" if you choose to serialize the fields
- Member visibility (private, protected, public, published)
- Custom serializer registration
- Use UTC date in serialization
Neon supports the (de)serialization of most Delphi standard types, records, array and of course classes. Classes can be complex as you want them to be, can contain array, (generic) lists, sub-classes, record, etc...
- Basic types: string, Integer, Double, Boolean, TDateTime
- Arrays of (basic types, records, classes, etc...)
- Records with fields of (basic types, records, classes, arrays, etc...)
- Classes with fields of (basic types, records, classes, arrays, etc...)
- Generic lists
- Dictionaries (key must be of type string)
- Streamable classes
- Inherit from
TCustomSerializer
and register the new serializer class in the configuration
- Better way to register (and find) a custom serializer
- Unit Tests
This library has been tested with Delphi 10.4 Sydney, Delphi 10.3 Rio, Delphi 10.2 Tokyo, Delphi 10.1 Berlin, but with a minimum amount of work it should compile with Delphi XE7 and higher
This library has no dependencies on external libraries/units.
Delphi units used:
- System.JSON (DXE6+)
- System.Rtti (D2010+)
- System.Generics.Collections (D2009+)
Simply add the source path "Source" to your Delphi project path and.. you are good to go!
The easiest way to serialize and deserialize is to use the TNeon
utility class:
Object serialization:
var
LJSON: TJSONValue;
begin
LJSON := TNeon.ObjectToJSON(AObject);
try
Memo1.Lines.Text := TNeon.Print(LJSON, True);
finally
LJSON.Free;
end;
end;
Object deserialization:
var
LJSON: TJSONValue;
begin
LJSON := TJSONObject.ParseJSONValue(Memo1.Lines.Text);
try
TNeon.JSONToObject(AObject, LJSON, AConfig);
finally
LJSON.Free;
end;
Using the TNeonSerializerJSON
and TNeonDeserializerJSON
classes you have more control over the process.
Object serialization:
var
LJSON: TJSONValue;
LWriter: TNeonSerializerJSON;
begin
LWriter := TNeonSerializerJSON.Create(AConfig);
try
LJSON := LWriter.ObjectToJSON(AObject);
try
Memo1.Lines.Text := TNeon.Print(LJSON, True);
MemoError.Lines.AddStrings(LWriter.Errors);
finally
LJSON.Free;
end;
finally
LWriter.Free;
end;
end;
Object deserialization:
var
LJSON: TJSONValue;
LReader: TNeonDeserializerJSON;
begin
LJSON := TJSONObject.ParseJSONValue(Memo1.Lines.Text);
if not Assigned(LJSON) then
raise Exception.Create('Error parsing JSON string');
try
LReader := TNeonDeserializerJSON.Create(AConfig);
try
LReader.JSONToObject(AObject, LJSON);
MemoError.Lines.AddStrings(LWriter.Errors);
finally
LReader.Free;
end;
finally
LJSON.Free;
end;
It's very easy to configure Neon,
var
LConfig: INeonConfiguration;
begin
LConfig := TNeonConfiguration.Default
.SetMemberCase(TNeonCase.SnakeCase) // Case settings
.SetMembers(TNeonMembers.Properties) // Member type settings
.SetIgnoreFieldPrefix(True) // F Prefix settings
.SetVisibility([mvPublic, mvPublished]) // Visibility settings
// Custom serializer registration
.GetSerializers.RegisterSerializer(TGUIDSerializer)
;
end;