Разбор Json с суперобъектом Delphi

Я новичок в JSON. У меня есть следующие данные JSON, и я не знаю, как читать transaction объекты id а также amount ценности.

{
  "errorCode": 0,
  "errorMessage": "ok",
  "platform": 4,
  "order": {
    "id": "3425",
    "description": "test api",
    "amount": 1.39,
    "currency": "RON",
    "billing": {
      "country": null,
      "county": null,
      "city": null,
      "address": "address",
      "postal_code": null,
      "first_name": "fn",
      "last_name": "ln",
      "phone": "0000000000",
      "email": "me@mobilpay.com"
    },
    "shipping": null,
    "installments": null,
    "installments_sel": null,
    "bonuspoints": null,
    "products": {
      "item": {
        "id": null,
        "name": null,
        "description": null,
        "info": null,
        "group": null,
        "amount": null,
        "currency": null,
        "quantity": null,
        "vat": null
      }
    },
  "hash": "1BB262DEE09B15ED98B777A27740E16B1F00004E",
  "transaction": {
    "id": "461512",
    "amount": 1.39,
    "currency": "RON",
    "paymentUrl": "/qp/BdKQsV1d-DsGz0e-4Bkq2e",
    "current_payment_count": null
  },
  "params": null
}

Я могу прочитать errorCode и errorMessage, но я не знаю, как получить доступ к транзакции id,

Это код, который я до сих пор:

function TuDm_Athlos.ReadJson(ContentStr: TStream; var Order: TOrder): Boolean;
var
  workJson : ISuperObject;
begin
  Result := False;
  workJson := TSuperObject.ParseStream(ContentStr,False);
  Order.ErrorCode := StrToInt(workJson.S['errorCode']);
  order.ErrorMessage := workJson.S['errorMessage'];
  for workJson in workJson.O['transaction'] do
  begin
    Order.id := workJson.S['id'];
  end;
  Result := True;
end; 

2 ответа

Вам нужно углубиться в иерархию объектов JSON. На основе кода, который вы оставили в комментарии:

function TuDm_Athlos.ReadJson(ContentStr: TStream; var Order: TOrder): Boolean;
var
  JSON: ISuperObject;
  Order: ISuperObject;
  Trans: ISuperObject;
begin
  Result := False;

  JSON := TSuperObject.ParseStream(ContentStr, False);
  if not Assigned(JSON) then
    Exit;

  Order := JSON.O['order'];
  if not Assigned(Order) then
    Exit;

  Trans := Order.O['transaction'];
  if not Assigned(Trans) then
    Exit;

  Order.ID := Trans.I['id'];
  Order.Amount := Trans.D['amount'];
  Order.ErrorCode := JSON.I['errorCode'];
  Order.ErrorMessage := JSON.S['errorMessage'];

  Result := True;
end;

Я знаю, что это довольно старый пост, но я столкнулся с тем же. Если вы прилежный разработчик, вы можете включить проверку диапазона и переполнение во время разработки. Версия SuperObject, с которой вы работаете, может использовать Hash для быстрых сравнений ключей, определенных как Cardinal. Метод Hash предполагает, что он может переполнить кардинальный тип, но это переполнение отключит диапазон и проверку переполнения. Чтобы сделать это правильно, вы можете изменить модуль для использования Int64 вместо Cardinal, а затем в методе Hash замаскировать вычисленное значение, чтобы сократить его до 32 бит, как в:

h: = (h * 129 + ord (k [i]) + $ 9e370001) и $FFFFFFFF;

Тот же эффект, без переполнения.

Просто создайте переменную h: UInt64 и не переполните AV.

Другие вопросы по тегам