Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.178 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TJsonObject kann kein Enum?

  Alt 14. Jun 2019, 19:06
Delphi-Version: 10 Seattle
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)
  Mit Zitat antworten Zitat