繁体   English   中英

如何获取动态TClientDataset(基于TRESTResponseDataSetAdapter)以正确识别布尔值?

[英]How do I get a dynamic TClientDataset (based on TRESTResponseDataSetAdapter) to correctly recognise boolean values?

我已经在Delphi XE5中构建了一个利用Rest库的delphi客户端示例:

  • TRestClient
  • TRestRequest
  • TRestResponse
  • TRESTResponseDataSetAdapter
  • TClientDataSet(和绑定到TDBGrid的TDataSource和
    TcxGridDBTableView)

所有这些都由ASP.net Web API提供服务,该API根据来自Delphi的动态查询生成数据集。 我可以成功运行查询并将数据返回给客户端并呈现数据,但是布尔字段被呈现为空白。

  • 如何使TClientDataSet正确识别数据类型?
  • 这是使用TRESTResponseDataSetAdapter或TClientDataSet的正确方法吗?
  • 是否有人对这些组件有任何经验

编辑令人惊讶的是,Embarcadero的TRestResponseDatasetAdapter在内部执行此操作以创建字段:

procedure TCustomJSONDataSetAdapter.CB_CollectFieldDefs(const AJSONObject: TJSONObject);
var
  LJSONPair: TJSONPair;
begin
  for LJSONPair in AJSONObject do
  begin
    DoAddDataSetFieldDef(LJSONPair.JsonString.Value, ftString);
  end;
end;

字段类型都被硬编码为ftString!

这是返回的json:

"Table": [
        {
            "Id": 34,
            "Node": "Navision_ASN_1",
            "FormatId": 2,
            "Value": null,
            "ParentID": null,
            "DocumentOrder": 1,
            "Combined": false,
            "Delimiter": "",
            "ValueType": 0,
            "Ignore": false,
            "IsIndexer": false,
            "IsCounter": false,
            "StringFormat": null
        },
        {
            "Id": 35,
            "Node": "MessageHeader",
            "FormatId": 2,
            "Value": null,
            "ParentID": 34,
            "DocumentOrder": 2,
            "Combined": false,
            "Delimiter": "",
            "ValueType": 0,
            "Ignore": false,
            "IsIndexer": false,
            "IsCounter": false,
            "StringFormat": null
        },
        {
            "Id": 52,
            "Node": "Consignment",
            "FormatId": 2,
            "Value": null,
            "ParentID": 34,
            "DocumentOrder": 13,
            "Combined": false,
            "Delimiter": "",
            "ValueType": 0,
            "Ignore": false,
            "IsIndexer": false,
            "IsCounter": false,
            "StringFormat": null
        },
        {
            "Id": 53,
            "Node": "Line",
            "FormatId": 2,
            "Value": null,
            "ParentID": 52,
            "DocumentOrder": 18,
            "Combined": false,
            "Delimiter": "",
            "ValueType": 0,
            "Ignore": false,
            "IsIndexer": false,
            "IsCounter": false,
            "StringFormat": null
        }
    ]

你不能!

问题归结于Embarcadero Delphi的TJsonObject类。 在Rest.Response.Adapter单元中,将返回的json解析为TJsonObject,然后在CB_CollectFieldDefs和CB_CollectFieldData中迭代对象中的所有TJsonPair。

第一个问题:CB_CollectionFieldDefs将ftString硬编码为要添加到每个字段定义的dataSet的数据类型。 因此,我从Web API调用中返回了字段类型,以消除猜测并手动构建了字段定义。 当RestResponseDataSetAdapter具有字段定义时,该单元将正确跳过CB_CollectionFieldDefs,这将导致第二个问题。

第二个问题 :对象中的TjsonPair无法正确解析布尔json值。 到调用CB_CollectFieldData时,所有应该为变量类型的布尔值都是空字符串。 因此,我们得到了异常“无法将类型(UnicodeString)的变体转换为类型(Boolean)”。

可悲的是,我不得不放弃这套有希望的组件,以增强Fabricio Colombo出色的rest client api。 使用他的GetAsDataSet逻辑中的模式,我创建了许多发布方法来发布json(因为从内置的delphi单元创建的json是不正确的,所以我用SuperObject代替了该方法)。 介绍了PostJson和CreateDataset ,它们都返回TClientDataSets。

function TResource.CreateDataset(data: string; table: string = ''; titles: string = ''): TClientDataSet;
var
  vJson: ISuperObject;
begin
  vJson := SuperObject.SO(data);

  Result := TJsonToDataSetConverter.CreateDataSetMetadata(vJson, table, titles);
  TJsonToDataSetConverter.ToDataSet(Result, vJson.O[table]);
end;
// which allows me to do:
ds := jsonrestclient1.Resource(url)
          .ContentType(RestUtils.MediaType_Json)
          .Accept(restutils.MediaType_Json)
          .PostJson(json, 'Table', 'Titles');
// or
rs := jsonrestclient1.Resource(url)
          .ContentType(RestUtils.MediaType_Json)
          .Accept(restutils.MediaType_Json);
data:= rs.PostJson(Query) ;
vJson := SO(data);
fHasMore := vJson.B['HasMore'];
ds:= rs.CreateDataset(data, 'Table', 'Titles');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM