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

智能推荐

Docker运行参数详解_docker ipam-driver 取值-程序员宅基地

文章浏览阅读1.8k次。 Docker运行参数详解 docker search 参数: MacdeMacBook-Pro:~ mac$ docker network create --helpUsage: docker network create [OPTIONS] NETWORKCreate a networkOptions: --attachable ..._docker ipam-driver 取值

poj3252(记忆优化,数位dp)-程序员宅基地

文章浏览阅读611次。题意:找出给定范围中满足这个条件的数的个数:这个数各个转化成2进制0个数大于1的个数。题解:设定状态:因为这题各个数位的关系只与0、1的个数有关,那么就可以这样dp[pos][one][zero]位数pos一的个数为one零的个数为zero满足条件数的个数。注意前导零的问题,所以在搜索时加了特别的判断!因为二进制只有0和1,前导零是不算在这个数中零的个数上面的。#include_poj3252

VScode Error Lens插件_error lens插件能不能设置不要提示 unknown word-程序员宅基地

文章浏览阅读414次,点赞10次,收藏8次。安装完成之后,当我们输入一些错误的语法格式的时候,它都会有一些提示!设置搜索 typescript.local。_error lens插件能不能设置不要提示 unknown word

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。_,可以帮助她计算字符串a b的结果,即从字符串a中把字符串b所包含的字符全删-程序员宅基地

文章浏览阅读7.4k次,点赞3次,收藏8次。本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。输入格式:输入在2行中先后给出字符串A和B。两字符串的长度都不超过10​4​​ ,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。输出格式:在一行中打印出A−B的结果字符串。输入样例:I love GPLT! It’s a fun game!aeiou输出样例:I lv GPLT! It’s fn gm!解题思路:_,可以帮助她计算字符串a b的结果,即从字符串a中把字符串b所包含的字符全删

移动物联网简介_物联网业务pcf-程序员宅基地

文章浏览阅读3k次。物联网核心网的总体网络组织架构如图所示,主要核心网元及平台包括HLR/HSS(物联卡号码及用户数据存储)、PGW(用于疏通物联卡用户的数据业务)、CG(存储物联卡用户的计费话单)、短信中心(用于物联卡终端短信的转发)、PBOSS/CMIOT(业务受理开通、计费话单采集等)、物联网运营管理平台(OneLink平台,负责全网业务的运营支撑,实现物联网业务运营管理、通信管理、能力管理等)、业务网关(提供M-SMSC与业务平台间短信的转发)。由于5G的更新,通信能力的不断升级换代,2G网络已陆续进行减频。_物联网业务pcf

flowable 配置自定义表单_web工作流管理系统开发之四 自定义表单-程序员宅基地

文章浏览阅读2.2k次。在开发工作流管理系统时,很多人只重视流程引擎,流程模型的建立,而忽略了自定义表单工具。自定义表单工具是实现独立业务模块的可视化编辑工具,业务模块可以通过这种工具编辑生成。如果单纯从流程实现来说,确实自定义表单不是重点,流程实现了,可以挂接上表单就可以了。至于表单业务模块,可以是表单工具生成的,也可以是代码编写的表单,总之能用代码来实现的是最灵活的。但实际上流程的每一个步骤的业务数据都需要靠表单来展...

随便推点

《剑指offer》c++版本 14.剪绳子_c++剪绳子-程序员宅基地

文章浏览阅读354次。本题在牛客网剑指offer专项里没看到,原书第二版上有,如题:这道题是开放的动态规划题,题目中只给了绳子长度,却没定义具体剪多少段,初遇此题,难以下手,看了题解,豁然开朗。设f(n)为常为n的绳子剪成m段之后可得最大值,则存在n-1中减法,得f(n) = MAX(f(i) * f(n-i));初始值f(1),f(2),f(3)都可以计算出来,大于3则调用dp方程递归计算至n即可。思路简..._c++剪绳子

python语言可以自学吗_python可以自学吗-程序员宅基地

文章浏览阅读667次。python可以自学。任何一门编程语言都可以自学。如果是零基础的同学,学起来可能要吃力,而且在学习过程中找不到成就感,很容易打击自信心,所以要自学一定要找对方法。下面小编就为大家介绍一下自学python的方法。自学python的方法第一、学习Python,自学或者跟老师学都可以,得看个人的学习方式和方法,重点是要坚持下去,不然都是空话!第二、确定自己的学习方向。避免走弯路,选一个自己的目标方向。第..._python自学行吗

代码_代码:sourl.cn/dwdmqp-程序员宅基地

文章浏览阅读1.1w次。2#include #include #define SIZE 101 using namespace std; int a[SIZE][SIZE]; /* 最Á?大ä¨子Á¨段?和¨ª */int MaxSubArray(int n, int* a){ int max = 0; int b = 0; for (int i = 0; i < n;_代码:sourl.cn/dwdmqp

2020-02-02-程序员宅基地

文章浏览阅读68次。目前中国国内的第三方支付产品主要有网关/快捷/微信/支付宝等。其中用户数量最大的是网关支付/微信/支付宝. 第三方支付接口申请提供资料: 关于个人申请第三方支付接口:第三方支付接口个人申请的或者企业申请的,请联系QQ 66322016 申请,因为有些支付接口平台不提供个人支付接口的申请。 第三方支付接口如何对接流程: 第一步:签订合约通过第三方拿到接口,拿到接口后,要确认下接口类型,是否是自己需要...

MATLAB 在一个数组中随机选择n个数_matlab从数组中随机选取几个数-程序员宅基地

文章浏览阅读5.6w次,点赞29次,收藏143次。MATLAB 中在一个数组内随机选择n个数。例如:在 A = [10, 50, 80, 100, 130, 260] 中随机选择5个数。允许重复:n = 5;A = [10, 50, 80, 100, 130, 260];random_num = A(randi(numel(A),1,n));random_num = sort(random_num);不允许重复:n = 5;A = [10, 50, 80, 100, 130, 260];random_num = A(randperm(_matlab从数组中随机选取几个数

推荐文章

热门文章

相关标签