FAQ > 金融建模 > 第三方交互 > TS-OPI

Q:TSL&OPI方式调用示例:行情订阅,将订阅接收的json串解析成天软数组    

  • 本文主要展示开发者用户通过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.在本地导出行情订阅数据文件(部分结果)