本文主要展示开发者用户通过OPI接口进行行情订阅后把接收到json串解析成天软数组的实现示例。
参考:
Q:TSL&OPI方式调用示例:行情订阅
实现说明
将json串解析成天软数组的模型
定义:TD_ParseChunckedJson(s,endS,AllData,unStr,subData,fieldName):array
说明:将订阅中分段接收的json串解析成天软数组---舍头保尾
参数:
s:string,入参,json串
endS:string,入参,分割符
AllData:array,出参,json串解析的数组
unStr:string,出参,分隔符后面的内容
subData:array,出参,json中指定fieldName下标解析的数组
fieldName:string,入参,行情订阅的下标,默认"CmdData"
返回:数组,json传中所有内容
代码:
Function TD_ParseChunckedJson(s,endS,AllData,unStr,subData,fieldName);
begin
//将订阅中分段接收的json串解析成天软数组---舍头保尾
//输入:s json串,endS 分割符
//输出:AllData能完整解析的数据组合,subData解析后的"CmdData"子项或指定项的数据组合,
//unStr为尾巴上未解析的串
strEs:=s[length(s)-length(endS):];
subArr:=str2array(s,endS);//分割
unStr:='';//未处理部分
AllData:=array();
tArr:=subArr;
if strEs<>endS then begin
if length(subArr)>=2 then tArr:=subArr[:length(subArr)-2];
else tArr:=array();
unStr:=subArr[length(subArr)-1];//最后一行
end
tArr::
try
AllData&=array(importjsonstring(mcell));
except
echo "解析失败:mrow(",mrow,")->",mcell,"\r\m";
end;
if ifnil(subData) then return AllData;//不合并子集
subData:=array();
if ifnil(fieldName) then fieldName:="CmdData";//行情订阅的下标
if fieldName not in mcols(AllData,1) then return AllData;//fieldName不存在
//-------合并子集-------
for i,r in AllData do subData&=r[fieldName];
return AllData;
end
调用范例
url:='https://opi.tinysoft.com.cn/Service/Subscription/';
tbody:=array("Type":1,"IDs":("SH600519","SZ000002"),"SUBs":("date_s","price"));
body:=ExportJsonString(tbody);
//TS-BOUNDARY设置分割符
headArr:=array("Connection: keep-alive","Content-Type: application/json","JSON-Encode: gbk","TS-BOUNDARY: end");
header:=array2str(headArr,"\r\n");
sid:=CreateHttpSession();
sethttpMode(sid,1);//设置chunked模式(分段模式),分段输出模式
echo "\r\n";
tuser:="user"; //用户账号
tpassw:="password"; //用户密码
rt:=array();
while timeof(now())<strtotime("15:01:00") do //到15:01 收盘后停止接收行情
begin
r:=InternetRequest(sid,url,"",header,body,tuser,tpassw,0,res,resp,30000);
echo "->excute:",r," resp->",resp," res->",res,"\r\n";
//--分段模式下数据拼接与标准化处理
if resp=200 or resp=1000 then begin
dS:=ifstring(unStr)?(unStr+res):res;
TD_ParseChunckedJson(dS,"end",AllData,unStr,subData);
rt&=subData;
echo "subData->",length(subData),"\r\n";
echo "unStr->",unStr,"\r\n";
end
end
DestroyHttpSession(sid);//销毁该会话
ret:=ExportFile(ftXLS(),"","D:\\Downloads\\行情订阅_"$datetoint(today())$".xlsx",rt);
echo rt;
return ;
Function TD_ParseChunckedJson(s,endS,AllData,unStr,subData,fieldName);
begin
strEs:=s[length(s)-length(endS):];
subArr:=str2array(s,endS);//分割
unStr:='';//未处理部分
AllData:=array();
tArr:=subArr;
if strEs<>endS then begin
if length(subArr)>=2 then tArr:=subArr[:length(subArr)-2];
else tArr:=array();
unStr:=subArr[length(subArr)-1];//最后一行
end
tArr::
try
AllData&=array(importjsonstring(mcell));
except
echo "解析失败:mrow(",mrow,")->",mcell,"\r\m";
end;
if ifnil(subData) then return AllData;//不合并子集
subData:=array();
if ifnil(fieldName) then fieldName:="CmdData";//行情订阅的下标
if fieldName not in mcols(AllData,1) then return AllData;//fieldName不存在
//-------合并子集-------
for i,r in AllData do subData&=r[fieldName];
return AllData;
end
执行结果:
1.打印盘中行情订阅的信息
2.在本地导出行情订阅数据文件(部分结果)
