我收到的回复如下:
{
"successful": true,
"responseMessage": "OK",
"responseCode": 2000,
"messages": [
{
"messageId": "da86ede3-83de-4080-9c20-e8a335a7ac25",
"messageType": "MessageComposeSendNotification",
"queuedDateTime": 1402092032000,
"processAttemptCount": 0,
"processed": false
},
{
"messageId": "382556a3-0654-4a1c-9b54-8393097d9ec9",
"messageType": "RecordFileImport",
"queuedDateTime": 1410811005000,
"processAttemptCount": 1,
"processed": false
}
]
}
我只需执行 js.Field['successful'].value
就可以很好地访问前三个字段call 或其他字段名称。我现在需要访问Messages
大批。我想做的是逐步执行 Messages
中的每一项。如果MessageType
是 "RecordFileImport"
我想保存MessageID
到字符串列表。
现在我无法访问Messages
。我想我需要创建一个新的 tlkJSONObject
或者可能是tlkJSONList
访问其内容,但我似乎无法实例化该对象,并且不知道如何浏览项目。
我使用的是 Delphi 7 和 LkJSON v1.07。
最佳答案
Field[]
属性返回一个 TlkJSONbase
对象。您可以使用该属性来访问所有字段,甚至数组。访问 messages
字段时,您可以使用其 Count
和 Child[]
属性,而不是使用其 Value
属性特性。例如:
var
js: TlkJSONbase;
Messages: TlkJSONbase;
MessageIDs: TStringList;
I: Integer;
begin
...
js := ...;
...
messages := js.Field['messages'];
MessageIDs := TStringList.Create;
try
for I := 0 to messages.Count-1 do
begin
if VarToStr(messages.Child[I].Field['messageType'].Value) = 'RecordFileImport' then
MessageIDs.Add(VarToStr(messages.Child[I].Field['messageId'].Value));
end;
...
finally
MessageIDs.Free;
end;
end;
或者,您可以将 messages
字段类型转换为 TlkJSONlist
并使用其 ForEach()
方法。例如:
procedure TMyClass.GetMessageIDs(ElName: string; Elem: TlkJSONbase; data: pointer; var Continue: Boolean);
begin
if VarToStr(Elem.Field['messageType'].Value) = 'RecordFileImport' then
TStringList(data).Add(VarToStr(Elem.Field['messageId'].Value));
end;
procedure TMyClass.ProcessJson;
var
js: TlkJSONbase;
Messages: TlkJSONlist;
MessageIDs: TStringList;
begin
...
js := ...;
...
messages := js.Field['messages'] as TlkJSONlist;
MessageIDs := TStringList.Create;
try
messages.ForEach(GetMessageIDs, MessageIDs);
...
finally
MessageIDs.Free;
end;
end;
关于arrays - Delphi 7 中使用 JSON 进行数组处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879911/