红鱼儿

学习Delphi原生JSON框架(一) 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不存在,将产生异常。 

五、将JSONValue转换成JSON字符串 

前面已经实现如何将一个JSON串转成一个TJSONValue对象,如何把这个对象再转换成JSON串呢?

答案是利用TJSONValue.ToString方法,看下面代码:

  jv:=TJSONValue.ParseJSONValue(jsonstr);
  if jv<>nil then
  begin
    ShowMessage(jv.ToString);//转换成一个json字符串
  end;

显示结果:

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

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

 

posted on 2022-11-29 17:40  红鱼儿  阅读(2503)  评论(0编辑  收藏  举报