在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
正在用 WebBroker 写一个小网站,感受颇多:
uses System.JSON; //TJSONObject procedure TForm1.Button1Click(Sender: TObject); var j: TJSONObject; begin j := TJSONObject.Create; j.AddPair('aa', '111'); j.AddPair('bb', '222'); //输出字符串 Memo1.Text := j.ToString; //结果:{"aa":"111","bb":"222"} {ToJSON 与 ToString 结果相同,但应尽量使用 ToString 而不是 ToJSON;因为 ToJSON 也是调用 ToString 并且还要重新分配内存} j.Free; end; //TJSONArray procedure TForm1.Button2Click(Sender: TObject); var a: TJSONArray; begin a := TJSONArray.Create; a.Add(1); //TJSONArray 不像传统的数组,它可以接受几种不同类型的值;这应该算是对 Delphi 数组功能的扩充吧。 a.Add(2); a.Add('aaa'); a.Add('bbb'); Memo1.Text := a.ToString; //结果:[1,2,"aaa","bbb"] a.Free; end; //当 TJSONObject 嵌套其他对象时 procedure TForm1.Button3Click(Sender: TObject); var j: TJSONObject; a: TJSONArray; begin j := TJSONObject.Create; a := TJSONArray.Create('aaa', 'bbb'); //可以使用两个值初始化 a.Add(1); a.Add(2); j.AddPair('arr', a); Memo1.Text := j.ToString; //结果:{"arr":["aaa","bbb",1,2]} // a.Free; {千万不要释放其内部对象,它的父对象会自动释放它} j.Free; end; //变通上例 procedure TForm1.Button4Click(Sender: TObject); var j: TJSONObject; begin j := TJSONObject.Create; j.AddPair('arr', TJSONArray.Create); with j.Values['arr'] as TJSONArray do begin Add('aaa'); Add('bbb'); Add(1); Add(2); end; Memo1.Text := j.ToString; //结果:{"arr":["aaa","bbb",1,2]} j.Free; end; //再变通 procedure TForm1.Button5Click(Sender: TObject); var j: TJSONObject; a: TJSONArray; begin j := TJSONObject.Create; j.AddPair('arr', TJSONArray.Create); a := TJSONArray(j.Values['arr']); a.Add('aaa'); a.Add('bbb'); a.Add(1); a.Add(2); Memo1.Text := j.ToString; //结果:{"arr":["aaa","bbb",1,2]} j.Free; end; //添加其他类型的数 procedure TForm1.Button6Click(Sender: TObject); var j: TJSONObject; a: TJSONArray; begin j := TJSONObject.Create; j.AddPair('数值', TJSONNumber.Create(3.1415926)); j.AddPair('布尔真', TJSONTrue.Create); j.AddPair('布尔假', TJSONFalse.Create); j.AddPair('空值', TJSONNull.Create); Memo1.Text := j.ToString; //结果:{"数值":3.1415926,"布尔真":true,"布尔假":false,"空值":null} j.Free; end; //读取 procedure TForm1.Button7Click(Sender: TObject); var j: TJSONObject; str: string; num: Integer; arr1,arr2: string; begin j := TJSONObject.Create; j.AddPair('str', '111'); j.AddPair('num', TJSONNumber.Create(222)); j.AddPair('arr', TJSONArray.Create('arr1', 'arr2')); Memo1.Text := j.ToString; //结果:{"str":"111","num":222,"arr":["arr1","arr2"]} //JSON 是一组”键值对“,其中的”值“还有可能是”键值对“; //所以 System.JSON 用 TJSONValue 来表示值类型,它是所有值类型的父类,当然也是 TJSONObject 的父类。 str := j.Values['str'].Value; //Values[] 调用的是 GetValue(), 更喜欢直接用后者 num := j.GetValue('num').Value.ToInteger; arr1 := TJSONArray(j.GetValue('arr')).Items[0].Value; arr2 := TJSONArray(j.GetValue('arr')).Items[1].Value; Memo1.Lines.Add(Format('%s, %d, %s, %s', [str, num, arr1, arr2])); //111, 222, arr1, arr2 j.Free; end; //遍历 procedure TForm1.Button8Click(Sender: TObject); var j: TJSONObject; p: TJSONPair; v: TJSONValue; i: Integer; a: TJSONArray; begin j := TJSONObject.Create; j.AddPair('aa', '111'); j.AddPair('bb', '222'); j.AddPair('arr', TJSONArray.Create('arr1', 'arr2')); //集合遍历 TJSONObject for p in j do Memo1.Lines.Add(p.ToString); //"aa":"111" \\ "bb":"222" \\ "arr":["arr1","arr2"] //索引遍历 TJSONObject, 这里的 Get 函数已不提倡使用了 for i := 0 to j.Count - 1 do Memo1.Lines.Add(j.Get(i).ToString); //"aa":"111" \\ "bb":"222" \\ "arr":["arr1","arr2"] //集合遍历 TJSONArray for v in j.Values['arr'] as TJSONArray do Memo1.Lines.Add(v.Value); //arr1 \\ arr2 //索引遍历 TJSONArray a := j.Values['arr'] as TJSONArray; for i := 0 to a.Count - 1 do Memo1.Lines.Add(a.Items[i].Value); //arr1 \\ arr2 j.Free; end; //存取到文件 procedure TForm1.Button9Click(Sender: TObject); var j1,j2: TJSONObject; begin //随便虚拟些数据 j1 := TJSONObject.Create(TJSONPair.Create('aaa', '111')); j1.AddPair('bbb', j1.Clone as TJSONValue); ChDir('c:\temp'); //写入文件 with TStringList.Create do begin Add(j1.ToString); SaveToFile('JsonTest.txt', TEncoding.UTF8); //结果:{"aaa":"111","bbb":{"aaa":"111"}} Free; end; j1.Free; //从文件读取 with TStringList.Create do begin LoadFromFile('JsonTest.txt', TEncoding.UTF8); j2 := TJSONObject.ParseJSONValue(Text) as TJSONObject; Free; end; Memo1.Text := j2.ToString; //结果:{"aaa":"111","bbb":{"aaa":"111"}} j2.Free; end; //修改、删除 procedure TForm1.Button10Click(Sender: TObject); var j: TJSONObject; begin j := TJSONObject.Create; j.AddPair('aaa', '111'); j.AddPair('bbb', '222'); j.AddPair('ccc', '333'); //修改 j.Get('aaa').JsonValue := TJSONString.Create('11111'); //TJSONPair 的 JsonString、JsonValue 分别是 键、值 // j.Pairs[0].JsonValue := TJSONString.Create('11111'); //删除 j.RemovePair('bbb'); Memo1.Lines.Add(j.ToString); //结果:{"aaa":"11111","ccc":"333"} j.Free; end; //根据路径添加数组的函数: procedure CreateJSONPathArr(aJson: TJSONObject; const aPath: string; jArr: TJSONArray); var arr: TArray<string>; path: string; i: Integer; begin arr := aPath.Split(['.'], ExcludeEmpty); for i := 0 to Length(arr) - 1 do begin if not aJson.TryGetValue(arr[i], aJson) then begin if i = Length(arr) - 1 then aJson.AddPair(arr[i], jArr) else begin aJson.AddPair(arr[i], TJSONObject.Create); aJson.TryGetValue(arr[i], aJson); end; end; end; end; //调用测试: var j: TJSONObject; a: TJSONArray; begin j := TJSONObject.Create; a := TJSONArray.Create('11', '22'); CreateJSONPathArr(j, 'aaa.bbb.ccc', a); a := TJSONArray.Create('33', '44'); CreateJSONPathArr(j, 'aaa.bbb.ddd', a); j.Free; end; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论