2016-05-10 34 views
0

我有一個從服務器的以下JSON:德爾福/超對象 - 訪問子節點離開返回NIL

{ 
    "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); 

謝謝!

+0

你使用哪個版本的superobject,從哪個站點?我曾經使用過的版本(v.1.2)也有很多問題,有些字段無法派生。所以我切換到xsuperobject可在這裏:[鏈接](https://github.com/onryldz/x-superobject) –

+0

@AndreRuebel,我使用1.2版本[鏈接](https://github.com/hgourvest/superobject),我將測試xsuperobject併發布結果。 – Zero

+0

是的,這也是我用過的。它似乎在特殊條件下解析問題。這是相當一段時間,所以我不記得我遇到問題的確切條件。不幸的是,你將不得不改變你的代碼來使用xsuperobject,因爲這種方法有些不同。但從那以後它對我很有用。 –

回答

0

在這裏提到這一點:

由邏輯,內OrderItem的的值可以是這樣的情況:orderObj [ 'OrderItems.OrderItem'];

這確實會起作用。
但你寫了這個矛盾最後一句之後:

,但如果我嘗試訪問喜歡的OrderId一個「簡單」的價值,這是第一要素,使用orderObj [「的OrderId」];

通過邏輯,正如你所說,要訪問你可以做的值:

orderObj['OrderItems.OrderItem.OrderId']; 
直接

,而不是orderObj['OrderId'];

+0

是的,這是正確的,在這種情況下,我需要這樣做:'orderObj ['OrderItems.OrderItem [0] .OrderId'];'。在這個迴應中,我只獲得了一件物品,但在更多情況下...... – Zero