我是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;
答案 0 :(得分: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;
答案 1 :(得分:0)
我知道这是一个非常古老的帖子,但我遇到了同样的事情。如果您是勤奋的开发人员,则可能会在开发过程中启用范围检查和溢出检查。您正在使用的SuperObject版本可以使用Hash进行快速键比较,这些比较被定义为Cardinal。 Hash方法假设它可以溢出Cardinal类型,但该溢出将跳转范围和溢出检查。要正确地执行此操作,您可以修改单位以使用Int64代替Cardinal,然后在Hash方法中屏蔽计算值以将其降低至32位,如:
h:=(h * 129 + ord(k [i])+ $ 9e370001)和$ FFFFFFFF;
同样的效果,没有溢出。
答案 2 :(得分:0)
只需将变量h:UInt64设置为无溢出即可。