Delphi XE10,Json 生成和解析,再利用indyhttp控件Post_delphixe json post-程序员宅基地

技术标签: jsonobject  Delphi  

--不多说,直接上代码
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 
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013408061/article/details/94616790

智能推荐

pyinstaller将py文件打包成EXE文件(保姆级教程)_pyinstaller打包py文件为exe-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏19次。一、PyInstaller 库的安装1.一般安装步骤:pip install pyinstaller一般的安装方法是在cmd命令提示符环境下输入:window+r 运行cmd输入以下内容切换到pip目录下输入pip install pyinstaller2.使用python安装PyInstaller打开python设置项目添加搜索安装软件包安装完成二、 pyinstaller的使用打开cmd命令提示符 切换到pyinstaller..._pyinstaller打包py文件为exe

c++如何让字符串重复输出_[Python学习笔记]Python基础02之字符串-程序员宅基地

文章浏览阅读409次。点击上方蓝字关注我们,一起涨姿势!在Python基础01之入门中,我们学习了Python中的输入(input()),输出(print())的使用,变量赋值,简单运算符的相关知识,今天一起来学习字符串的知识。一、字符串基础字符串是 Python 中最常用的数据类型,它是一种不可变序列。可以使用引号来创建字符串,引号可以是'单引号'"双引号" '''三单引号''', """三双引号""",单..._c++连续输出三个字符可以用乘号吗

虚拟机、容器与沙盒技术有什么区别?_docker和sandbox-程序员宅基地

文章浏览阅读1k次。虚拟机和容器技术都可以看作是沙箱的不同表现。虚拟机和容器。前者是对硬件的虚拟化,后者则更像是操作系统的虚拟化。两者都提供了沙箱的能力:虚拟机通过硬件级抽象提供,而容器则使用公共内核提供进程级的隔离。_docker和sandbox

PR导出错误怎么办?解决PR导出视频提示“编译影片时出错“ GPU渲染错误 错误代码:-1609629695-程序员宅基地

文章浏览阅读4.9w次,点赞7次,收藏11次。有位用户在使用PR模板制作视频时,遇到PR导出出错的问题,问题描述:编译影片时出错,加速渲染器错误”(如下图所示)编译影片时出错。GPU渲染错误无法处理帧。这部分因视频内容不同而出错提示不同,所以省略…组件EfedFillert类型 GPU视频滤镜选择器:9错误代码:-1609629695于是亲测该PR模板:PR模板 卖房售房租房酒店促销等产品幻灯片展示PR视频模板找到了解决办法。如果你也遇到同样问题,可以尝试下面的方法哦。1、点击菜单“文件”,选则“项目设置”,点击“常规”。如._-1609629695

window10 jupyter notebook 遇到‘ImportError: DLL load failed: 找不到指定的模块。’的问题_jupyter notebook 导入库 报错 importerror: dll load fail-程序员宅基地

文章浏览阅读4k次,点赞6次,收藏5次。将 Anaconda3 的路径添加到环境变量中,在cmd先运行activate root 在运行jupyter notebook。_jupyter notebook 导入库 报错 importerror: dll load failed while importing _a

Spring Cloud Stream App Starters-程序员宅基地

文章浏览阅读50次。Spring Cloud Stream Application Starters are standalone executable applications that communicate over messaging middleware such as Apache Kafka and RabbitMQ. These applications can run independently o...

随便推点

i.MX8MPlus中的CLK子系统_imx8mm_clocks_init-程序员宅基地

文章浏览阅读1.1k次。芯片手册中的clk框架CCM(Clock Control Module)框架图外部时钟的输入源有24MHz,32.768KHz以及四个EXT CLK。这7个输入源都可以直接连接到CCM,但是PLL只能以24MHz,32.768KHz作为输入。从PLL和分频器出来的时钟也可以作为CCM的输入。每一个Slice在经过MUX模块后,由分频器产生我们需要的时钟频率,然后再输出给Gate模块,以便控制时钟的开关。CLK ROOT相关寄存器每一个Slice都有自己的index、偏移地址和时钟源配置寄存器CC_imx8mm_clocks_init

html5动效系列二:超级惊艳 10款HTML5动画特效推荐_html5加载动画特效-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏63次。文章来源:http://www.lanlanwork.com/blog/?post=2684蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供有效的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务每一个扁平化界面设计_html5加载动画特效

Handler dispatch failed; nested exception is java.lang.StackOverflowError_handler dispatch failed nested-程序员宅基地

文章浏览阅读2.3w次,点赞3次,收藏5次。今天在写SSM项目的时候,遇到Handler dispatch failed; nested exception is java.lang.StackOverflowError这样的错误,真的是我太马虎,这里SSM是用聚合项目来管理各个模块,对于不同的service和dao模块之间可能需要手动依赖StackOverflowError通常情况下是死循环或者是循环依赖了。出现这样错的原因:没有..._handler dispatch failed nested

【开源】串口YMODEM实现IAP程序升级(附工程源码)_ymodem工具-程序员宅基地

文章浏览阅读7k次,点赞15次,收藏132次。GD32串口 、YMODEM 、IAP升级_ymodem工具

青龙面板-签到合集_微博超话签到 青龙面板-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏27次。常用网站签到本地/云函数/青龙脚本( 人人视频|刺猬猫小说|Acfun|WPS| 时光相册|书香门第论坛|绅士领域|好游快爆|埋堆堆|多看阅读|一亩三分地|闪艺app|香网小说|晋江|橙光|什么值得买|网易蜗牛读书|网易云游戏平台|龙空论坛|NGA论坛|csdn|mt论坛|sf轻小说|猫耳FM|联想智选app|联想智选联想延保|联动云租车|数码之家|玩物志好物商店|togamemod|好书友论坛|鱼C论坛|帆软社区|村花论坛|纪录片之家|富贵论坛|ug爱好者|阅次元论坛|菜鸟图库|魅族社区|经管之家|有分享_微博超话签到 青龙面板

jetson-tx2平台mttcan驱动分析-程序员宅基地

文章浏览阅读2.2k次。 tx2内部集成了can控制器,用的是Bosch的芯片。can的驱动在tx2内核中被注册为网络设备也就是socket can,说到这里相信很多人已经猜到了驱动的大致架构,下面记录了我分析驱动的过程。 首先该驱动还是遵循platform架构,所以我们这里就直接进入到probe函数了。static int mttcan_probe(struct platform_devic..._mttcan