利用SuperObject 循环处理Json深层次的值

这篇博客展示了如何在Delphi中利用SuperObject库解析和处理JSON数据,特别是涉及多层嵌套的对象和数组。通过示例代码,作者演示了如何获取并展示JSON对象的键值、数组长度,以及如何递归遍历`children`和`M_TYPE`节点,获取`name`、`MACHINE_TYPE`、`MACHINE_NO`、`STATUS`和`BALANCE`等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="delphi">procedure TForm1.Button5Click(Sender: TObject);
var
  item,jo: ISuperObject;
  ja,JA_TYPE,JA_MAC:TSuperArray;    //json数组
  i,j,k:Integer;
  jts: TSuperTableString;  //TSuperTableString 的常用属性: count、GetNames、GetValues
begin
  jo := SO(Memo1.Text);
  jts:=jo.AsObject;
  mmo1.Lines.Add('结点数:'+IntToStr(jts.count ));
  mmo1.Lines.Add('键名:'+jts.GetNames.AsString);
  mmo1.Lines.Add('键值:'+jts.GetValues.AsString);
  jts:=jo['addresses'].AsObject;
  mmo1.Lines.Add('结点数:'+IntToStr(jts.count ));
  mmo1.Lines.Add(jts.GetNames.AsString);
  mmo1.Lines.Add('键值:'+jts.GetValues.AsString);
  jts:=jo.A['children'].N[0].AsObject;
  mmo1.Lines.Add('结点数:'+IntToStr(jts.count ));
  mmo1.Lines.Add(jts.GetNames.AsString);
  mmo1.Lines.Add('键值:'+jts.GetValues.AsString);
  jts:=jo.A['children'].N[0].A['M_TYPE'].N[0].AsObject;
  mmo1.Lines.Add('结点数:'+IntToStr(jts.count ));
  mmo1.Lines.Add(jts.GetNames.AsString);
  mmo1.Lines.Add('键值:'+jts.GetValues.AsString);
  jts:=jo.A['children'].N[0].A['M_TYPE'].N[0].A['MACHINE'].N[0].AsObject;
  mmo1.Lines.Add('结点数:'+IntToStr(jts.count ));
  mmo1.Lines.Add(jts.GetNames.AsString);
  mmo1.Lines.Add('键值:'+jts.GetValues.AsString);

  ja:=jo.A['children'];  //等同 ja:=jo.O['children'].AsArray;


  for i := 0 to ja.Length-1 do
  begin

    mmo1.Lines.Add('店主:'+ja.O[i].s['name']);  //区分大小写
    JA_TYPE:=ja.O[i].O['M_TYPE'].AsArray;

    for j := 0 to ja_type.Length-1 do
    begin
      mmo1.Lines.Add('出票类型:'+IntToStr(JA_TYPE.O[j].I['MACHINE_TYPE']));
      mmo1.Lines.Add('出票类型名:'+JA_TYPE.O[j].s['MACHINE_NAME']);
      JA_MAC:=JA_TYPE.O[j].O['MACHINE'].AsArray;
      for k := 0 to ja_mac.Length-1 do
      begin
        mmo1.Lines.Add('机器编号:'+JA_MAC.O[k].s['MACHINE_NO']);
         mmo1.Lines.Add('机器状态:'+IntToStr(JA_MAC.O[k].I['STATUS']));
        mmo1.Lines.Add('机器余额:'+FloatToStr(JA_MAC.O[k].D['BALANCE']));
      end;
    end;
  end;



 // for item in jo do ShowMessage(item.AsJSon(False, False));
end;
//--------------------------Json格式如下

{
    "name": "张三",
    "age": 33,
    "sex": true,
    "weight": 123.456,
    "tel": [ "86-1111111", "86-2222222"  ],
    "addresses": {
        "address": "A省B市",
        "pc": "100001"
    },
    "children": [
        {
            "name": "张继",
            "age": "22",
            "sex": true,
            "M_TYPE": [
                {
                    "MACHINE_TYPE": 1,
                    "MACHINE_NAME": "传统",
                    "MACHINE": [ { "MACHINE_NO": "26088", "STATUS": 2, "BALANCE": 12.3 }  ]
                },
                {
                    "MACHINE_TYPE": 2,
                    "MACHINE_NAME": "竞彩",
                    "MACHINE": [{ "MACHINE_NO": "26093", "STATUS": 1, "BALANCE": 100.22 } ]
                }
            ]
        },
        {
            "name": "张承",
            "age": "11",
            "sex": false,
            "M_TYPE": [
                {
                    "MACHINE_TYPE": 3,
                    "MACHINE_NAME": "传统",
                    "MACHINE": [{"MACHINE_NO": "26038", "STATUS": 3, "BALANCE": 1300.5} ]
                }
            ]
        }
    ]
}
<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">
</span></span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值