• DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST


    Delphi XE10,Json 生成和解析,再利用indyhttp控件Post
    2017年09月20日 18:30:23
    阅读数:1973
    --不多说,直接上代码
    procedure TFrmMain.Brand;
    var
      JSONObject, jsonparam: TJSONObject; // JSON类
      jsonArray: TJSONArray; // JSON数组变量
      i: Integer;
      Flag_Do: Boolean;
    
      jsonToSend: TStringStream;
      jsonStr, RjsonStr: string;
      RJSONObject, Rjsondata, RjsonlistObjItem: TJSONObject; // JSON类
      RJsonArray: TJSONArray; // JSON数组变量
      InfoCount: Integer;
      TMPStr, TMPItemValue: string;
      SbrandId: Double;
      SbrandCode, SchineseName, SenglishName, SlogoUrl, Sintroduction: string;
      InfoCode, InfoMsg: string;
    begin
      Flag_Do := True;
      URL := 'http://devhhplus.oudianyun.com:2035/open-api/product-web/brand/getBrand.do';
    
      try
        while Flag_Do do
        begin
          JSONObject := TJSONObject.Create;
          jsonparam := TJSONObject.Create;
          jsonArray := TJSONArray.Create;
    
          with DmMain.ADOQuery1 do
          begin
            Close;
            Parameters.Clear;
            SQL.Clear;
            //SQL.Add('{call pkg_SynZhongTai.sp_GetBrand(?)}');
            SQL.Add('{call pkg_SynZhongTai.sp_GetBrand}');
            Open;
            if RecordCount = 0 then
            begin
              Flag_Do := False;
              Break;
            end;
            First;
            while not Eof do
            begin
              jsonArray.Add(FieldByName('BrandID').AsString);
              JSONObject.AddPair('brandId', jsonArray);
              JSONObject.AddPair('brandName', FieldByName('BrandName').AsString);
              Next;
            end;
          end;
    
          jsonparam.AddPair('app_id', app_id);
          jsonparam.AddPair('v', '1.0');
          jsonparam.AddPair('jsonData', JSONObject);
          jsonparam.AddPair('sign', getSign(jsonparam));
    
          jsonStr := getFormData(jsonparam);
    
          RjsonStr := SendPost(URL, jsonStr);
    
          RJSONObject := TJSONObject.ParseJSONValue(RjsonStr) as TJSONObject;
          Rjsondata := TJSONObject.ParseJSONValue(Trim(RJSONObject.GetValue('data').ToString)) as TJSONObject;
          InfoCount := StrToInt(Rjsondata.GetValue('total').ToString);
    
          InfoCode := RJSONObject.GetValue('code').ToString;
          RJSONObject.TryGetValue('msg', InfoMsg);
          RJsonArray := TJSONArray(Rjsondata.GetValue('listObj'));
    
          for i := 0 to RJsonArray.Size - 1 do
          begin
            RjsonlistObjItem := TJSONObject.ParseJSONValue(RJsonArray.items[i].ToString) as TJSONObject;
        //    Memo2.Lines.Add('brandId:' + RjsonlistObjItem.GetValue('brandId').ToString);
            if RjsonlistObjItem.TryGetValue('brandId', TMPItemValue) then
              SbrandId := StrToFloat(TMPItemValue);
            if RjsonlistObjItem.TryGetValue('brandCode', TMPItemValue) then
              SbrandCode := TMPItemValue;
            if RjsonlistObjItem.TryGetValue('chineseName', TMPItemValue) then
              SchineseName := TMPItemValue;
            if RjsonlistObjItem.TryGetValue('englishName', TMPItemValue) then
              SenglishName := TMPItemValue;
            if RjsonlistObjItem.TryGetValue('logoUrl', TMPItemValue) then
              SlogoUrl := TMPItemValue;
            if RjsonlistObjItem.TryGetValue('introduction', TMPItemValue) then
              Sintroduction := TMPItemValue;
    
            with DmMain.ADOStoredProc1 do
            begin
              Close;
              Parameters.Clear;
              ProcedureName := 'pkg_SynZhongTai.sp_SynZTBrandWeb';
              Parameters.CreateParameter('vbrandidweb', ftFloat, pdInput, 100, SbrandId);
              Parameters.CreateParameter('vbrandCode', ftString, pdInput, 100, SbrandCode);
              Parameters.CreateParameter('vchineseName', ftString, pdInput, 100, SchineseName);
              Parameters.CreateParameter('venglishName', ftString, pdInput, 100, SenglishName);
              Parameters.CreateParameter('vlogoUrl', ftString, pdInput, 100, SlogoUrl);
              Parameters.CreateParameter('vintroduction', ftString, pdInput, 100, Sintroduction);
              ExecProc;
            end;
          end;
          LogWrite('code:' + InfoCode + '。msg:' + InfoMsg);
    
          JSONObject := nil;
          jsonparam := nil;
          jsonArray := nil;
          RJSONObject := nil;
          Rjsondata := nil;
          RjsonlistObjItem := nil;
          RJsonArray := nil;
        end;
      finally
    
      end;
    end;
    
    
    
    function TFrmMain.SendPost(AURL, AjsonStr: string): string;
    var
      jsonToSend: TStringStream;
      TMPResult: string;
    begin
      try
        try
          // 以列表的方式提交参数
          IdHTTP.HandleRedirects := True; // 允许头转向
          IdHTTP.ReadTimeout := 5000; // 请求超时设置
          IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; //'application/json'; // 设置内容类型为json
    
          Memo1.Clear;
          Memo1.Text := AjsonStr;
    
          jsonToSend := TStringStream.Create(AjsonStr, TEncoding.UTF8);
          jsonToSend.Position := 0; // 将流位置置为0
    
          // IdHttp.Post(Url,jsonToSend,ResponseStream);
          TMPResult := IdHTTP.Post(AURL, jsonToSend);
        except
          on e: Exception do
          begin
            ShowMessage(e.Message);
          end;
        end;
      finally
        LogWrite(TMPResult);
        Result := TMPResult;
      end;
    end;
    function getSign(params: TJSONObject): string;
    var
      arrString, arrString1: array of string;
      len, i: Integer;
      s1: TStringList;
      TMPStr, TMPValue, TMP1, TMPMD5: string;
      md5: THashMD5;
    begin
      params.RemovePair('sign');
      len := params.Count;
      SetLength(arrString, len);
      SetLength(arrString1, len);
    
      for i := 0 to len - 1 do
      begin
        // arrString[i] := params.Get(i).ToString;
        //arrString[i] := params.Pairs[i].JsonString.ToString;
        arrString[i] := StringReplace(params.Pairs[i].JsonString.ToString, '"', '', [rfReplaceAll]);
        //ShowMessage(arrString[i]);
      end;
      // ItemArry:= params.GetValue('jsonData') as TJSONArray;
    
      s1 := TStringList.Create;
      for i := 0 to length(arrString) - 1 do
      begin
        s1.Add(arrString[i]);
      end;
    
      s1.Sort;
      for i := 0 to s1.Count - 1 do
      begin
        arrString1[i] := s1.Strings[i];
      end;
    
      TMPStr := TMPStr + app_secret;
    
      for i := 0 to len - 1 do
      begin
        // TMPValue := params.GetValue(arrString1[i]).ToString;
        // ShowMessage(arrString1[i]);
        // ShowMessage(StringReplace(arrString1[i], '"', '''', [rfReplaceAll]));
        TMP1 := StringReplace(arrString1[i], '"', '', [rfReplaceAll]);
        // ShowMessage(TMP1);
        // ShowMessage(params.ToString);
        // ShowMessage(params.Values['jsonData'].ToString);
        TMPValue := params.Values[TMP1].ToString;
        if arrString1[i] <> 'jsonData' then
        begin
          TMPValue := StringReplace(TMPValue, '"', '', [rfReplaceAll]);
        end;
    
        if TMPValue <> '' then
        begin
          TMPStr := TMPStr + arrString1[i] + TMPValue;
        end;
      end;
      TMPStr := TMPStr + app_secret;
      //Application.MessageBox(PChar(TMPStr), '加密前', mrOk);
    
      TMPMD5 := UpperCase(md5.GetHashString(TMPStr));
      Result := TMPMD5;
    end;
    
    function getFormData(params: TJSONObject): string;
    var
      arrString, arrString1: array of string;
      // ItemArry:TJSONArray;
      len, i: Integer;
      s1: TStringList;
      TMPStr, TMPValue, formData, TMP1: string;
    
      md5: THashMD5;
    begin
      len := params.Count;
      SetLength(arrString, len);
      SetLength(arrString1, len);
    
      for i := 0 to len - 1 do
      begin
        // arrString[i] := params.Get(i).ToString;
        //arrString[i] := params.Pairs[i].JsonString.ToString;
        arrString[i] :=  StringReplace(params.Pairs[i].JsonString.ToString, '"', '', [rfReplaceAll]);
      end;
      // ItemArry:= params.GetValue('jsonData') as TJSONArray;
    
      s1 := TStringList.Create;
      for i := 0 to length(arrString) - 1 do
      begin
        s1.Add(arrString[i]);
      end;
    
      s1.Sort;
      for i := 0 to s1.Count - 1 do
      begin
        arrString1[i] := s1.Strings[i];
      end;
    
      TMPStr := '';
    
      for i := 0 to len - 1 do
      begin
        // TMPValue := params.GetValue(arrString1[i]).ToString;
        TMP1 := StringReplace(arrString1[i], '"', '', [rfReplaceAll]);
        if arrString1[i] <> 'jsonData' then
        begin
          TMPValue := StringReplace(params.Values[TMP1].ToString, '"', '', [rfReplaceAll]);//params.Values[TMP1].ToString;
        end
        else
        begin
          TMPValue := params.Values[TMP1].ToString;
        end;
    
        if TMPValue <> '' then
        begin
          if TMPStr <> '' then
            TMPStr := TMPStr + '&';
    
          TMPStr := TMPStr + arrString1[i] + '=' + TMPValue;
        end;
      end;
      Result := TMPStr;
    end;
    
    
    
    ---------------------------------------------------------------------------------------------------------------
    
    对于数值类型就需要使用TJSONNumber了,TJSONNumber支持Double、Integer、Int64等。使用方法如下
    
    uses Data.DBXJSON;
    
    var
      JSON: TJSONObject;
    begin
      JSON := TJSONObject.Create;
      JSON.AddPair('Double', TJSONNumber.Create(123.456));
      JSON.AddPair('Integer', TJSONNumber.Create(6789));
      JSON.AddPair('string', TJSONNumber.Create('1000'));
      Memo1.Lines.Text := JSON.ToString;  //=> {"Double":123.456,"Integer":6789,"string":1000}
      JSON.Free;
    
    Boolean类型的值需要用到TJSONTrue和TJSONFalse。
    
    uses System.JSON;
    
    var
      JSON: TJSONObject;
    begin
      JSON := TJSONObject.Create;
      JSON.AddPair('', TJSONTrue.Create);
      JSON.AddPair('', TJSONFalse.Create);
      Memo1.Lines.Text := JSON.ToString;  //=> {"真":true,"假":false}
      JSON.Free;
  • 相关阅读:
    [WPF]搜索列表项的四种实现方案点评
    一个生成均匀分布随机数的问题
    制作NSIS命令行窗口输出插件
    公司的Principle给出的高性能数据库设计,总觉得别扭
    用WordPress一步步建立自己的博客站点
    译作要严格尊重原著吗?——读〈Windows核心编程〉小感
    这么好的书怎么全国都缺货?
    【C语言】用c语言实现简单的五子棋
    【C语言】游戏菜单界面设计 与 游戏整合
    【C语言】基于五子棋框架上的 象棋 小游戏
  • 原文地址:https://www.cnblogs.com/railgunman/p/10290583.html
Copyright © 2020-2023  润新知