2016-05-10 3 views
0

У меня есть следующие JSON от сервера:Delphi/надобъект - Доступ к подузлам прочь возвращения 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

Какую версию суперобъекта вы используете и с какого сайта? У меня также было много проблем с версией I, когда-то использовавшейся (v.1.2), что некоторые поля не могли быть получены. Поэтому я переключился на xsuperobject, доступный здесь: [link] (https://github.com/onryldz/x-superobject) –

+0

@AndreRuebel, я использую версию 1.2 из этой [link] (https://github.com/hgourvest/superobject), я проведу xsuperobject и отправлю результат. – Zero

+0

Да, это тот, который я использовал. Кажется, что в особых условиях проблемы разбора. Это довольно давно, поэтому я не могу вспомнить точные условия, при которых у меня были проблемы. К сожалению, вам придется изменить свой код, чтобы использовать xsuperobject, так как подход несколько отличается. Но это работает для меня с тех пор. –

ответ

0

Здесь вы упоминаете это:

По логике, значения внутренней части OrderItem может быть доступ, как это: orderObj [ 'OrderItems.OrderItem'];

Это действительно сработает.
Но сразу после того, как вы написали это противоречащее последнее предложение:

но если я пытаюсь получить доступ к «простому» значению как OrderId, который является первым элементом, с помощью orderObj [ «OrderId»];

По логике, как вы говорите, чтобы получить доступ к значениям можно сделать:

orderObj['OrderItems.OrderItem.OrderId']; 

и не orderObj['OrderId']; непосредственно.

+0

yup, это правильно, в этом случае мне нужно сделать вот так: 'orderObj ['OrderItems.OrderItem [0] .OrderId'];'. В этом ответе я получил только один элемент, но в случае большего ... – Zero

 Смежные вопросы

  • Нет связанных вопросов^_^