Stelle ich mich zu dumm an oder geht folgendes nicht?
Delphi-Quellcode:
program JsonToEnumProject;
uses
System.SysUtils,
System.Json;
type
TEnum = (one, two, three);
const
input = '{"enum": "two"}';
var
jsonObject: TJSONObject;
enum: TEnum;
begin
jsonObject := (TJSONObject.ParseJSONValue(input) as TJSONObject);
try
// EJSONException: 'Conversion from TJSONString to TEnum is not supported'
enum := jsonObject.GetValue<TEnum>('enum');
Assert( enum = TEnum.two);
finally
jsonObject.Destroy();
end;
end.
In
System.Json
sehe ich dass in der Routine
StrToTValue
bei einem enum es nicht einmal versucht wird. Ernsthaft? Ist das in aktuellen Delphi-Versionen immer noch so?
Falls ja, ich habe mir einen kleinen Helper gemacht. Wäre der so ok?
Delphi-Quellcode:
function TJsonObjectHelper.GetValue<T>(const APath: string): T;
var
enumInfo: PTypeInfo;
enumAsString: String;
enumAsInteger: Integer;
begin
enumInfo := TypeInfo(T);
if(enumInfo.Kind = TTypeKind.tkEnumeration) then
begin
enumAsString := GetValue<String>(APath);
enumAsInteger := GetEnumValue(enumInfo, enumAsString);
if(enumAsInteger <> -1) then
Result := TValue.FromOrdinal(enumInfo, enumAsInteger).AsType<T>()
else
raise EJSONException.CreateFmt(SNoConversionAvailableForValue, [enumAsString, enumInfo.Name]);
end
else
Result := inherited GetValue<T>(APath);
end;
(
https://gist.github.com/JensMertelme...72876e55009129)