Delphi XE10,Json 生成和解析,再利用indyhttp控件Post

2024-09-06 14:08

本文主要是介绍Delphi XE10,Json 生成和解析,再利用indyhttp控件Post,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

--不多说,直接上代码
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;
--------------------- 
作者:苍穹帝 
来源:CSDN 
原文:https://blog.csdn.net/gjtao1130/article/details/78043988 
版权声明:本文为博主原创文章,转载请附上博文链接!

这篇关于Delphi XE10,Json 生成和解析,再利用indyhttp控件Post的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142217

相关文章

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C