【Delphi】JSON字符串格式化(无内存泄露,速度快)

本文介绍了如何在 Delphi 中使用 uWriters 单元来格式化 JSON 字符串,使原本难以阅读的一长串字符变得层次清晰、易于阅读。通过 TJsonStringWriter 和 TJsonStringReader 类实现格式化,并提供了示例代码展示如何处理包括数组在内的 JSON 数据。此方法经过测试,无内存泄露,且格式化速度快。
摘要由CSDN通过智能技术生成

在开发中,经常需要对JSON字符串进行格式化,便于阅读,如果不进行格式化,整个就是一长串字符,难以阅读。经过格式化的JSON字符串,换行、层级很清晰,适合阅读。这里介绍一种delphi格式化JSON字符串的方法。本函数支持JSON数组格式化!

需要使用到官方的 uWriters 单元,可以直接0分下载:https://download.csdn.net/download/sensor_WU/21106404

例如 JSON 字符串:{“name”:“sensor”,“add”:“China Shenzhen”,“age”:50,“color”:“red”}
格式化后:
{
“name”: “sensor”,
“add”: “China Shenzhen”,
“age”: 50,
“color”: “red”
}

程序如下:

{2021-08-16 sensor 经过测试,可以格式化 TJSONObject 和 TJSONArray 等
 大数据测试,无内存泄露,另外格式化速度块
}
unit uFormat_JSON;
interface
uses
   uWriters,    // 位于https://download.csdn.net/download/sensor_WU/21106404
   System.SysUtils,
   System.Classes,
   System.JSON,
   System.JSON.Types;

//格式化 JSON字符串
//参数说明:
// JSONStr : 需要进行格式化的字符串
// withTAB : 表示是否需要整体缩进,主要是为了写日志时看起来漂亮,格式化后的字符串有缩进。默认包含缩进
// 结果:已经格式化后的字符串。
function Format_JSON(JSONStr : string; withTAB : Boolean = True) : string;

implementation

function Format_JSON(JSONStr : string; withTAB : Boolean = True) : string;
var
  JsonWriter: TJsonStringWriter;
  JsonReader: TJsonStringReader;
  jv : TJSONValue;
begin
  //1. 首先判断下 JSONStr 是否是合法的 JSON 字符串,如果不是,就直接返回
  jv := TJSONObject.ParseJSONValue(JSONStr) as TJSONValue;
  if jv = nil then Exit(JSONStr);

  JsonReader := TJsonStringReader.Create(JSONStr);
  JsonWriter := TJsonStringWriter.Create;
  //这一句必须有,进行格式设置
  JsonWriter.Formatting := TJsonFormatting.Indented;  //System.JSON.Types
  try
    JsonWriter.WriteToken(JsonReader);
    Result := JsonWriter.ToString;
    //如果需要缩进
    if withTAB then
       begin
         Result := Result.Replace(#13#10,#13#10#9);
         Result := #9 + Result;
       end;
  finally
    JsonWriter.Free;
    JsonReader.Free;
  end;
 end;
end.

标记于2021-08-16 sensor

Delphi 7中,虽然它内置的JSON支持相对较弱,但是你可以通过第三方库或者编写一些自定义代码来处理JSON格式化。以下是一些常见的方法: 1. **使用第三方库**:例如使用TMS JSON Library这样的成熟库,它可以方便地序列化和反序列化JSON数据,并提供格式化功能。安装库后,可通过API将JSON字符串格式化输出。 ```delphi uses TmsJson; var json: TJsoValue; begin // 创建或填充JSON对象... json := TJsoValue.CreateFromObject(JsonObj); // 假设JsonObj是你创建的JSON对象 // 使用库提供的函数格式化并打印 Writeln(json.JsonString); end; ``` 2. **手动编码**:如果没有合适的库,你可以手动解析JSON到数组或记录结构,然后按照JSON规范重新构造字符串。这会涉及字符串拼接和循环操作。 ```delphi function JsonFormat(const InputStr: string): string; var Value, Key, Indent: Integer; Stack: array [0..10] of String; StackIndex: Integer; Buffer: TStringBuilder; begin // 省略实际的解析过程... Result := '{'; Indent := 2; Stack[StackIndex] := ''; StackIndex := 0; for Value in Values do begin StackIndex := Max(StackIndex - 1, 0); if Stack[Index] <> '' then begin Result := Result + ','; Inc(Indent); Result := Result + ' '; end; Result := Result + '"'+Key+'" : ' + FormatValue(Value, Indent); Stack[Index] := Result; // 保存当前状态,用于下一次迭代 end; Result := Result + '}'; // 省略缩进还原和换行操作... end; ``` 请注意,这种方法相对复杂,可能会比较繁琐。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值