0

我是 JSON 新手。我有以下 JSON 数据,但我不知道如何读取transaction对象idamount值。

{
  "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
}

我可以阅读errorCodeerrorMessage,但我不知道如何访问事务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; 
4

3 回答 3

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;
于 2017-08-14T11:38:10.683 回答
0

我知道这是一个很老的帖子,但我遇到了同样的事情。如果你是一个勤奋的开发者,你可能在开发过程中开启了范围检查和溢出检查。您正在使用的 SuperObject 版本可能会使用定义为 Cardinal 的 Hash 进行快速键比较。Hash 方法假定它可以溢出 Cardinal 类型,但溢出会触发范围和溢出检查。要正确执行此操作,您可以修改单位以使用 Int64 代替 Cardinal,然后在 Hash 方法中屏蔽计算值以将其缩减为 32 位,如下所示:

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

同样的效果,没有溢出。

于 2018-05-26T01:48:07.493 回答
0

只需制作变量 h: UInt64 并且没有 AV 溢出。

于 2020-03-30T13:51:17.273 回答