首页 > 其他分享 >Delphi原生JSON框架(一) TJsonValue

Delphi原生JSON框架(一) TJsonValue

时间:2024-07-18 13:29:07浏览次数:13  
标签:对象 Delphi json js JSON TJsonValue TJSONValue

Delphi自带了json支持,引用System.json,你就可以处理json,读写json格式的内容都是被支持的。发展了几个版本,无论性能及稳定性都已经成熟,我不喜欢引用更多的三方到项目中,所以,对于Delphi处理json来说,自带的是我的首选。

目前,Delphi Json的实现,支持json所有的类型:

TJSONObject

TJSONArray

TJSONNumber

TJSONString

TJSONTrue

TJSONFalse

TJSONNull

TJSONBool

这些类型都是从TJSONValue继承而来,那我们就先看看这个TJSONValue都实现了什么,以及怎么使用他?

二、如何将字符串转换成JSON对象

TJSONValue类实现了ParseJSONValue方法,原型如下:

   class function ParseJSONValue(const Data: string; UseBool: Boolean = False; RaiseExc: Boolean = False): TJSONValue; overload; static;

这个方法,将一个Json字符串,转换成一个TJSONValue对象。这是一个最常用的方法,因此是第一个要掌握的。

来看一下参数:

Data:需要处理的JSON串,这个方法,会将这个串转换为UTF8进行处理

UseBool:是否有Boolean类型

RaiseExe:转换过程中是否产生异常,默认情况下不产生异常,在不产生异常的情况下,如果转换失败,则返回nil。

现在我们看一个例子:

procedure TForm6.Button1Click(Sender: TObject);
var
  jsonstr:string;
  jv:TJSONValue;
  js:TJSONString;
begin
  jsonstr:=
            '{'                   + #13#10 +
            '    "person": {'        + #13#10 +
            '        "sex": "男",'     + #13#10 +
            '        "name": "王小二"' + #13#10 +
            '    }'                  + #13#10 +
            '}' ;

  jv:=TJSONValue.ParseJSONValue(jsonstr);
  if jv<>nil then
  begin
    if jv.TryGetValue<TJSONString>('person.sex',js) then
      ShowMessage(js.Value);
  end;

end;

上面的代码,将一个Json串转换成TJsonValue对象,并读出这个对象中的一个属性值。如果在转换的过程中有异常,是被忽略掉,并且返回nil。

注意:这个写法,是Delphi 11后才可以的,以前版本ParseJSONValue方法是在TJSONObject类中实现的,因此,要用TJSONObject做为转换对象来处理。

关于ParseJSONValue,官方同时还实现了5个重载的版本,如果掌握了上面说的版本,可以进一步去了解其他版本的用法,但基本是“回”字有几种写法的问题。

三、如何取得JSONValue对象

接下来,我们通过TryGetValue方法取得一个JSON中的对象,如你所见,在上面的代码中已经用到。先看一下他的原型声明:

 function TryGetValue<T>(const APath: string; out AValue: T): Boolean; overload;

参数说明:

APath:JSON中对象的路径,如果是多级的路径,中间用“.”来分隔,参见代码。

AValue:输出的对象

返回结果:Boolean类型,真表示取得对象,假表示没有查到找对应APath的对象。

该方法使用泛型实现,因此,你可以取得所有类型的JSON对象。

我是喜欢用这个方法来取得具体类型的JSON对象,当APath在json串中不存在时,他不会产生异常!同时,我们也知道是否成功取得了结果。

四、如何取得JSONValue的值

当取得了JSONValue对象后,利用他提供的属性可读取具体的值了。当然,这里你要知道取到的对象应该JSONValue的子类,诸如TJSONObject,TJSONString等。如上面的代码,我们取到一个TJSONString实例js,通过他的Value属性就可读取具体的值了。

注意:js.Value返回 男,而js.tostring则返回 “男”,是带双引号的。

上面是一种我喜欢的方法,但写法有些繁琐,需要建立js对象,那能不能直接根据APath读取值呢?答案是有的,看下面这行代码: 

 var s:= jv.P['person.sex'].Value;

通过TJSONValue.P属性直接读取指定Path对应的值。注意,与TryGetValue不同,如果Path不存在,将产生异常。 

好了,写到这里,可以算入门了!

综上所述,你现在应该知道:基于TJSONValue,可以将一个字符串转换成JSON对象,也可以将一个JSON对象转换成字符串,还可以判断并读取一个JSON子对象。

 

标签:对象,Delphi,json,js,JSON,TJsonValue,TJSONValue
From: https://www.cnblogs.com/sttchengfei/p/18309346

相关文章

  • 第十三篇 Json模块
    JSON函数使用JSON函数需要导入json库:importjson。函数描述json.dumps将Python对象编码成JSON字符串json.loads将已编码的JSON字符串解码为Python对象json.dumpsjson.dumps用于将Python对象编码成JSON字符串。语法json.dumps(obj,skipkeys=False,en......
  • mysql json语法总结
    json字段定义和插入创建一个带有json字段的表createtabletest10( idintnotnullauto_incrementcomment'id', namevarchar(64)nulldefault""comment'name', json_datajsondefaultnullcomment"json格式数据", primarykey(id))插......
  • FastJson详解
    文章目录一、FastJson介绍二、FastJson序列化API1、序列化Java对象2、序列化List集合3、序列化Map集合三、FashJson反序列化API1、反序列化Java对象2、反序列化List集合3、反序列化Map集合(带泛型)四、SerializerFeature枚举1、默认字段为null的不显示2、格式化五、@JSo......
  • laravel11:发生异常时返回json
    一,未配置前laravel11直接render页面如图:二,配置1, bootstrap/app.php<?phpuseIlluminate\Http\Request;useIlluminate\Auth\AuthenticationException;useIlluminate\Database\Eloquent\ModelNotFoundException;useIlluminate\Foundation\Application;useIllu......
  • Fastjson的payload收集
    What无第三方依赖收集了网络上的多种payload,方便进行fuzz测试提供了自动替换payload的功能,一次性为所有payload插入rmi地址/dnslogHelp--list:以清单的形式打印,方便作为字典进行fuzz--address:服务器地址(无需rmi://前缀),如11.22.33.44/exp、eval.com/rce--dns:dnslog的地址,不同......
  • 在存储过程输入输出参数中使用json
    SqlServer从2016开始支持json操作,JSON支持适用于SqlServer2016及以上版本和AzureSQLDatabase。sqlserver文档参考这里。有了这个json支持,默认过程只传入一个json字符串参数就可以了,方便很多。我们可以在内部做很多事情。甚至可以校验参数,鉴权或将结果集封装为标准的......
  • 实时时钟、弱函数、json
    一、实时时钟时间戳(实时的时间【单位:s】):​ 使用"time.h"文件:​ mktime()——得到一个时间戳​ localtime() ——得到一个当前时间的结构体(包含:年-月-日时:分:秒)eg:time_ttimestamp=mktime(&utc_time);//得到一个时间戳(单位为秒)structtm*beijing_time=lo......
  • Java实现将json数据转换为sql insert语句
    Java实现将json数据转换为sqlinsert语句importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importjava.util.Iterator;importjava.util.Map;publicclassJson......
  • C# 任意类型数据转JSON格式
    1publicclassObjectToJson2{3///<summary>4///List转成json5///</summary>6///<typeparamname="T"></typeparam>7///<paramname="jso......
  • 写了一个json小工具,希望大家体验(Mac平台)
    用rust写了一个json小工具“JSONPICKER”,欢迎大家试用:https://github.com/davelet/json-picker/releases/tag/V0.2动机是平常开发的时候,经常遇到大段json,里面的很多字段是不需要的。我所在的项目组在接口对接上出现了reponse达到数兆字节的情况市面上已经有不少json工具,......