【问题标题】:Delphi / SuperObject - Accessing subnodes away returning NILDelphi / SuperObject - 访问子节点返回NIL
【发布时间】:2016-05-10 20:19:57
【问题描述】:

我有以下来自服务器的 JSON:

{
  "SuccessResponse": {
    "Head": {
      "RequestId": "",
      "RequestAction": "GetMultipleOrderItems",
      "ResponseType": "Orders",
      "Timestamp": "2016-05-10T15:13:06-0300"
    },
    "Body": {
      "Orders": {
        "Order": [
          {
            "OrderId": "457634",
            "OrderNumber": "256176682",
            "OrderItems": {
              "OrderItem": {
                "OrderItemId": "712893",
                "ShopId": "14690930",
                "OrderId": "457634",
...

我正在使用以下代码来访问这些值:

procedure TForm1.GetOrdersPendingItems;
var
  mydata : string;
  obj, orderObj: ISuperObject;
  orderArray: TSuperArray;
begin
  mydata := GetURLAsString(GenerateApiUrl('GetMultipleOrderItems', 'OrderIdList', '[457634,457817]'));
  obj := SO(mydata);

  orderObj := obj['SuccessResponse.Body.Orders.Order'];
end;

使用此代码,如果我使用简单的Label1.Caption := orderObj.AsString;,它会告诉我:

"OrderId": "457634",
"OrderNumber": "256176682",
"OrderItems": {
   "OrderItem": {
       "OrderItemId": "712893",
       "ShopId": "14690930",
       "OrderId": "457634",
...

按照逻辑,OrderItem 内部的值可以像这样访问:orderObj['OrderItems.OrderItem'];,但如果我尝试访问像OrderId 这样的“简单”值,那就是第一个元素,使用orderObj['OrderId'];它返回nil 并且orderObj 的所有节点都会发生同样的情况...

因此,orderObj.AsString 中的值无法访问以转换为变量...

有没有办法访问OrderItem 内部的值?我的目标是使用以下代码将 OrderItem 的值转换为 ClientDataSet:

orderArray := orderObj.AsArray;
TJSONDB.JsonToClientDataSet(orderArray, cdsOrdersItems);

谢谢!

【问题讨论】:

  • 您使用哪个版本的超级对象以及来自哪个站点?我曾经使用的版本(v.1.2)也有很多问题,无法导出某些字段。所以我切换到这里可用的 xsuperobject:link
  • @AndreRuebel,我正在使用来自link 的 1.2 版本,我将测试 xsuperobject 并发布结果。
  • 是的,我也用过。在特殊情况下似乎有解析问题。这是很久以前的事了,所以我不记得我遇到问题的确切情况。不幸的是,您将不得不更改代码以使用 xsuperobject,因为方法有些不同。但从那以后它就对我有用。
  • @AndreRuebel,它工作得很好,但是 TJSONDB.JsonToClientDataSet(orderArray, cdsOrdersItems); 需要重写.. 哈哈哈,这会很好,因为将 json 转换为 clientdataset 的代码也有问题,我会做用简单的方法...但是现在我不知道如何处理这个问题,这是我在这里的第一个问题...
  • 嗨,零,欢迎来到 SO。第一个问题不错。如果您的问题已解决,请留言说明您的问题已解决,剩下的交给我们处理。

标签: json delphi superobject


【解决方案1】:

你在这里提到这个:

按照逻辑,OrderItem 内部的值可以这样访问:orderObj['OrderItems.OrderItem'];

这确实可行。
但是在你写下这句话后,与最后一句话相矛盾:

但如果我尝试使用 orderObj['OrderId']; 访问像 OrderId 这样的“简单”值,这是第一个元素;

按照您所说的逻辑,访问您可以执行的值:

orderObj['OrderItems.OrderItem.OrderId'];

而不是直接orderObj['OrderId'];。

【讨论】:

  • 是的,没错,在这种情况下,我需要这样做:orderObj['OrderItems.OrderItem[0].OrderId'];。在此回复中,我只收到了一项,但如果有更多...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
相关资源
最近更新 更多