delphi E2029 '('应为,但找到'THEN'

hmmo2u0o  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(192)

因此,我尝试在 Delphi 中编写一个函数,从SQL表中取出JSON文件,并在网格上显示其中的所有项。
其中一个是日期格式,这会导致应用程序崩溃,所以很自然地我会试着弄清楚它是哪一个,这样我就可以正确地格式化它。
然而,我用来尝试并找到它的方法一直显示上面的错误:

procedure InjectJSONIntoTable(Query: TFDQuery; MemTable: TFDMemTable; Edit: TEdit);
    var
        jsonString: string;
        jsonArr: TJSONArray;
        jsonItem: TJSONObject;
        jsonValue: TJSONValue;
        i: Integer;
        j: Integer;
        dummyString: string;
    begin
        // applies the sql command
        Query.SQL.Text := Edit.Text;
        Query.Open;
        // transforms the sql return back into JSON
        jsonString := Query.FieldByName('jdoc').AsString;
        jsonArr := TJSonObject.ParseJSONValue(jsonString) as TJSONArray;
        // preps the table to receive the data
        MemTable.Close;
        MemTable.CreateDataSet;
        MemTable.Open;
        MemTable.Insert;
        // appends the data to the table;
        for i := 0 to jsonArr.Count -1 do begin
          jsonItem := jsonArr.Items[i] as TJSonObject;
          for j := 0 to MemTable.Fields.Count - 1 do begin
            MemTable.Edit;
            jsonValue := jsonItem.GetValue(MemTable.FieldDefs[j].Name);
            if jsonValue.ClassType = TDateTime then ShowMessage('tralala');
                                                               ^ '(' expected but 'THEN' found
            MemTable.Fields[j].AsString
              := jsonItem.GetValue(MemTable.FieldDefs[j].Name).Value;
          end;
        end;

        MemTable.Post;
        // shows data on the table
    end;

也许我是瞎子,但我真的不能找出错误是从哪里来的。
我尝试了很多东西,改变了元素的顺序,但错误要么持续存在,要么出现了一堆新的错误。

2uluyalo

2uluyalo1#

TJSONValue.ClassType()方法返回一个TClass,它只能指向TObject派生的类型。TDateTime不是从TObject派生的类,所以你不能使用ClassType = TDateTime(或者ClassType is TDateTime,就像@ Dúthom建议的那样)。
JSON没有日期/时间值的概念,因此没有为TDateTime实现的TJSON...类。日期/时间对于JSON来说只是一个string
正如@JPRitchey提到的,您可以使用TJSONValue.TryGetValue()方法将jsonValue的值转换为TDateTime,检查转换是否成功。请注意,TryGetValue<TDateTime>()将成功 * 仅在以下情况下 *:

  • jsonValueTJSONString对象,字符串值以ISO-8601表示(因为转换使用DateUtils.ISO8601ToDate())。
  • jsonValueTJSONBool对象。转换将TDateTime设置为1.0(1899年12月31日)或0.0(1899年12月30日),具体取决于布尔值。

否则,TryGetValue<TDateTime>()将返回False
如果这不符合您的需求,您必须手动检查JSON值,例如:

var dtValue: TDateTime;

jsonValue := jsonItem.GetValue(MemTable.FieldDefs[j].Name);

// use whatever makes sense for your particular use-case...
if TryStrToDateTime(jsonValue.Value, dtValue) then
  ShowMessage('tralala');

MemTable.Fields[j].AsString := jsonValue.Value;
dojqjjoe

dojqjjoe2#

TDateTime不是类。它基本上是Double类型的别名。
这个错误是因为在这里唯一有意义的事情就是进行类型转换,比如 TDateTime(someVariable)
我相信你想做的是

var LDateTimeVar: TDateTime;
if jsonValue.TryGetValue<TDateTime>(LDateTimeVar) then ShowMessage('tralala');

相关问题