问好 發表於 2022-11-29 17:40:00

学习Delphi原生JSON框架(一) TJsonValue

<h3><span style="color: rgba(0, 128, 0, 1)">一、前言</span></h3>
<p>Delphi自带了json支持,引用System.json,你就可以处理json,读写json格式的内容都是被支持的。发展了几个版本,无论性能及稳定性都已经成熟,我不喜欢引用更多的三方到项目中,所以,对于Delphi处理json来说,自带的是我的首选。</p>
<p>目前,Delphi Json的实现,支持json所有的类型:</p>
<p>TJSONObject</p>
<p>TJSONArray</p>
<p>TJSONNumber</p>
<p>TJSONString</p>
<p>TJSONTrue</p>
<p>TJSONFalse</p>
<p>TJSONNull</p>
<p>TJSONBool</p>
<p>这些类型都是从TJSONValue继承而来,那我们就先看看这个TJSONValue都实现了什么,以及怎么使用他?</p>
<h3><span style="color: rgba(0, 128, 0, 1)">二、如何将字符串转换成JSON对象</span></h3>
<p>TJSONValue类实现了ParseJSONValue方法,原型如下:</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> ParseJSONValue(<span style="color: rgba(0, 0, 255, 1)">const</span> Data: <span style="color: rgba(0, 0, 255, 1)">string</span>; UseBool: Boolean = False; RaiseExc: Boolean = False): TJSONValue; <span style="color: rgba(0, 0, 255, 1)">overload</span>; static;</pre>
</div>
<p>这个方法,将一个Json字符串,转换成一个TJSONValue对象。这是一个最常用的方法,因此是第一个要掌握的。</p>
<p>来看一下参数:</p>
<p>Data:需要处理的JSON串,这个方法,会将这个串转换为UTF8进行处理</p>
<p>UseBool:是否有Boolean类型</p>
<p>RaiseExe:转换过程中是否产生异常,默认情况下不产生异常,在不产生异常的情况下,如果转换失败,则返回nil。</p>
<p>现在我们看一个例子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm6.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
jsonstr:</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
jv:TJSONValue;
js:TJSONString;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
jsonstr:</span>=
            <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{</span><span style="color: rgba(128, 0, 0, 1)">'</span>                   + #<span style="color: rgba(128, 0, 128, 1)">13</span>#<span style="color: rgba(128, 0, 128, 1)">10</span> +
            <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">    "person": {</span><span style="color: rgba(128, 0, 0, 1)">'</span>      + #<span style="color: rgba(128, 0, 128, 1)">13</span>#<span style="color: rgba(128, 0, 128, 1)">10</span> +
            <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">      "sex": "男",</span><span style="color: rgba(128, 0, 0, 1)">'</span>   + #<span style="color: rgba(128, 0, 128, 1)">13</span>#<span style="color: rgba(128, 0, 128, 1)">10</span> +
            <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">      "name": "王小二"</span><span style="color: rgba(128, 0, 0, 1)">'</span> + #<span style="color: rgba(128, 0, 128, 1)">13</span>#<span style="color: rgba(128, 0, 128, 1)">10</span> +
            <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">    }</span><span style="color: rgba(128, 0, 0, 1)">'</span>                  + #<span style="color: rgba(128, 0, 128, 1)">13</span>#<span style="color: rgba(128, 0, 128, 1)">10</span> +
            <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">}</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> ;

jv:</span>=<span style="color: rgba(0, 0, 0, 1)">TJSONValue.ParseJSONValue(jsonstr);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> jv&lt;&gt;<span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> jv.TryGetValue&lt;TJSONString&gt;(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">person.sex</span><span style="color: rgba(128, 0, 0, 1)">'</span>,js) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      ShowMessage(js.Value);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>上面的代码,将一个Json串转换成TJsonValue对象,并读出这个对象中的一个属性值。如果在转换的过程中有异常,是被忽略掉,并且返回nil。</p>
<p><span style="color: rgba(255, 0, 0, 1)">注意:</span>这个写法,是Delphi 11后才可以的,以前版本ParseJSONValue方法是在TJSONObject类中实现的,因此,要用TJSONObject做为转换对象来处理。</p>
<p>关于ParseJSONValue,官方同时还实现了5个重载的版本,如果掌握了上面说的版本,可以进一步去了解其他版本的用法,但基本是“回”字有几种写法的问题。</p>
<h3><span style="color: rgba(0, 128, 0, 1)">三、如何取得JSONValue对象</span></h3>
<p>接下来,我们通过TryGetValue方法取得一个JSON中的对象,如你所见,在上面的代码中已经用到。先看一下他的原型声明:</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">function</span> TryGetValue&lt;T&gt;(<span style="color: rgba(0, 0, 255, 1)">const</span> APath: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">out</span> AValue: T): Boolean; <span style="color: rgba(0, 0, 255, 1)">overload</span>;</pre>
</div>
<p>参数说明:</p>
<p>APath:JSON中对象的路径,如果是多级的路径,<strong>中间用“.”来分隔</strong>,参见代码。</p>
<p>AValue:输出的对象</p>
<p>返回结果:Boolean类型,真表示取得对象,假表示没有查到找对应APath的对象。</p>
<p>该方法使用泛型实现,因此,你可以取得所有类型的JSON对象。</p>
<p>我是喜欢用这个方法来取得具体类型的JSON对象,当APath在json串中不存在时,他不会产生异常!同时,我们也知道是否成功取得了结果。</p>
<h3><span style="color: rgba(0, 128, 0, 1)">四、如何取得JSONValue的值</span></h3>
<p>当取得了JSONValue对象后,利用他提供的属性可读取具体的值了。当然,这里你要知道取到的对象应该JSONValue的子类,诸如TJSONObject,TJSONString等。如上面的代码,我们取到一个TJSONString实例js,通过他的Value属性就可读取具体的值了。</p>
<p><span style="color: rgba(255, 0, 0, 1)">注意:js.Value返回 男,而js.tostring则返回 “男”,是带双引号的。</span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span>上面是一种我喜欢的方法,但写法有些繁琐,需要建立js对象,那能不能直接根据APath读取值呢?答案是有的,看下面这行代码:</span></span>&nbsp;</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">var</span> s:= jv.P[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">person.sex</span><span style="color: rgba(128, 0, 0, 1)">'</span>].Value;</pre>
</div>
<p>通过TJSONValue.P属性直接读取指定Path对应的值。注意,与TryGetValue不同,如果Path不存在,将产生异常。&nbsp;</p>
<img src="https://img2023.cnblogs.com/blog/367202/202211/367202-20221129172000966-1970745236.png">
<h3><span style="color: rgba(0, 128, 0, 1)">五、将JSONValue转换成JSON字符串&nbsp;</span></h3>
<p>前面已经实现如何将一个JSON串转成一个TJSONValue对象,如何把这个对象再转换成JSON串呢?</p>
<p>答案是利用TJSONValue.ToString方法,看下面代码:</p>
<div class="cnblogs_code">
<pre>jv:=<span style="color: rgba(0, 0, 0, 1)">TJSONValue.ParseJSONValue(jsonstr);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> jv&lt;&gt;<span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ShowMessage(jv.ToString);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">转换成一个json字符串</span>
<span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>显示结果:</p>
<img src="https://img2023.cnblogs.com/blog/367202/202211/367202-20221129173542343-823356012.png">
<p>好了,写到这里,可以算入门了!</p>
<p>综上所述,你现在应该知道:基于TJSONValue,可以将一个字符串转换成JSON对象,也可以将一个JSON对象转换成字符串,还可以判断并读取一个JSON子对象。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/kinglandsoft/p/16934314.html
頁: [1]
查看完整版本: 学习Delphi原生JSON框架(一) TJsonValue