delphi json 是不是有效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi json 是不是有效相关的知识,希望对你有一定的参考价值。

参考技术A 用、有用的类型,所以我仅仅用这两种例子做演示!
演示代码:

[delphi] view plaincopy

功能:DelphiXE7中使用JSON
------------------------------------------------------------------------------
说明:
1,使用Delphi自己带的JSON(system.json)。
2,这仅仅是一个简单例子,以后还会增加演示功能。
------------------------------------------------------------------------------
注意:
1,JSON类创建后,里面所有元素不用管释放,JSON类自己管理,千万不要画蛇添足啊!!!!!!
------------------------------------------------------------------------------
作者:孙玉良 QQ:14667479 Email:sunylat@163.com 修改时间:2014/11/23 00:13
------------------------------------------------------------------------------
开发工具:Delphi XE7
测试手机:华为荣耀X1

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Layouts, FMX.Memo;

type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
Memo2: TMemo;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormResize(Sender: TObject);
private
Private declarations

// 重新设置button按钮
procedure ResetButton;
public
Public declarations
end;

var
Form1: TForm1;

const
// 演示用的JSON
jsonString = '"name":"张三", "other":["中国","程序员"]';

implementation

$R *.fmx

uses
System.json; // Dephi自带的JSON单元

procedure TForm1.Button1Click(Sender: TObject);
var
JSONObject: TJSONObject; // JSON类
i: Integer; // 循环变量
temp: string; // 临时使用变量
jsonArray: TJSONArray; // JSON数组变量
begin

if Trim(Memo1.Text) = '' then
begin
ShowMessage('要解析数据不能为空!');
end
else
begin
JSONObject := nil;
try
从字符串生成JSON
JSONObject := TJSONObject.ParseJSONValue(Trim(Memo1.Text)) as TJSONObject;

if JSONObject.Count > 0 then
begin

1,遍历JSON数据
Memo2.Lines.Add('遍历JSON数据:' + #13#10);

Memo2.Lines.Add('JSON数据数量:' + IntToStr(JSONObject.Count));

for i := 0 to JSONObject.Count - 1 do
begin

if i = 0 then
begin
temp := JSONObject.Get(i).ToString + #13#10;;
end
else
begin
temp := temp + JSONObject.Get(i).ToString + #13#10;
end;

end;

output the JSON to console as String
Memo2.Lines.Add(temp);

Memo2.Lines.Add('------------------------------');

2,按元素解析JSON数据
Memo2.Lines.Add('按元素解析JSON数据:' + #13#10);
temp := 'name = ' + JSONObject.Values['name'].ToString + #13#10;
Memo2.Lines.Add(temp);

// json数组
jsonArray := TJSONArray(JSONObject.GetValue('other'));;
if jsonArray.Count > 0 then
begin

// 得到JSON数组字符串
temp := 'other = ' + JSONObject.GetValue('other').ToString + #13#10;

// 循环取得JSON数组中每个元素
for i := 0 to jsonArray.Size - 1 do
begin
temp := temp + IntToStr(i + 1) + ' : ' + jsonArray.Items[i]
.Value + #13#10;
end;

end;

Memo2.Lines.Add(temp);

end
else
begin
temp := '没有数据!';
Memo2.Lines.Add(temp);
end;

finally
JSONObject.Free;
end;
end;

end;

// 清空显示数据
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Text := '';
Memo2.Text := '';
end;

// 设置要解析的JSON数据
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Text := jsonString;
end;

// 设置要解析的JSON数据
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Text := jsonString;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
// 重新设置button按钮
self.ResetButton;
end;

// 重新设置button按钮
procedure TForm1.ResetButton;
var
buttonWidth: Integer;
begin
buttonWidth := self.Width div 3;

Button1.Width := buttonWidth;
Button2.Width := buttonWidth;
Button3.Width := buttonWidth;
end;

end.本回答被提问者和网友采纳

如何判断一个字符串是不是是有效的 JSON?

【中文标题】如何判断一个字符串是不是是有效的 JSON?【英文标题】:How to determine whether a string is valid JSON?如何判断一个字符串是否是有效的 JSON? 【发布时间】:2010-11-14 07:50:45 【问题描述】:

有谁知道 PHP 的健壮(和防弹)is_JSON 函数 sn-p 吗?我(显然)有一种情况,我需要知道一个字符串是否是 JSON。

嗯,也许通过JSONLint 请求/响应来运行它,但这似乎有点矫枉过正。

【问题讨论】:

射击;我有一个方便的防弹解决方案,但它不是很强大,所以我不得不放弃它:P 【参考方案1】:

如果您使用内置的json_decode PHP 函数,json_last_error 返回最后一个错误(例如,JSON_ERROR_SYNTAX 当您的字符串不是 JSON 时)。

通常json_decode 无论如何都会返回null

【讨论】:

是的,我是个白痴。这很明显,我只是错过了。我可以把它包装成我需要的东西。谢谢。 在大多数情况下是可靠的解决方案,但要小心。 json_decode 也可以解析例如数字字符串。字符串中的电话号码将被转换为整数。但是,这不会发生在每台服务器上。在我的 Windows 机器上我得到整数,在 linux 开发系统上我得到错误。我认为这取决于您的 PHP 安装和配置 正如 StoryTeller 提到的 - json_decode("51232") 的计算结果为 51232,因此可能并非在所有情况下都有用【参考方案2】:

对于我的项目,我使用此功能(请阅读json_decode() 文档中的“注意”)。

传递与传递给 json_decode() 相同的参数,您可以检测特定的应用程序“错误”(例如深度错误)

使用 PHP >= 5.6

// PHP >= 5.6
function is_JSON(...$args) 
    json_decode(...$args);
    return (json_last_error()===JSON_ERROR_NONE);

使用 PHP >= 5.3

// PHP >= 5.3
function is_JSON() 
    call_user_func_array('json_decode',func_get_args());
    return (json_last_error()===JSON_ERROR_NONE);

使用示例:

$mystring = '"param":"value"';
if (is_JSON($mystring)) 
    echo "Valid JSON string";
 else 
    $error = json_last_error_msg();
    echo "Not valid JSON string ($error)";

【讨论】:

我不是 PHP 专家,但这个解决方案似乎效率不高,因为当需要 JSON 解码时,它会执行两次:一次是在测试字符串是否为有效 JSON 时,然后第二次实际解码时。假设 json_decode 已经执行,让这个函数只检查最后一个 JSON 错误似乎更明智。我欢迎其他意见。 嗨@LiranH,原始发布者请求了一个'is_JSON'函数,因此我不能在函数中假设json_decode只是在请求的字符串上执行。在这种情况下,您的函数将被命名为“is_last_json_decoded_string_a_JSON_string”。 这很公平@cgaldiolo 尝试了你的 PHP PHP Fatal error: func_get_args(): Can't be used as a function parameter。只需在 func def 中定义参数 嗨@KolobCanyon,这是因为您使用的是PHP = 5.3,因为函数 json_last_error() 从该版本开始可用。我正在更新答案,谢谢。【参考方案3】:

如果给定的字符串不是有效的 JSON 编码数据,那么使用 json_decode 应该返回 null 怎么样?

参见手册页上的示例 3:

// the following strings are valid JavaScript but not valid JSON

// the name and value must be enclosed in double quotes
// single quotes are not valid 
$bad_json = " 'bar': 'baz' ";
json_decode($bad_json); // null

// the name must be enclosed in double quotes
$bad_json = ' bar: "baz" ';
json_decode($bad_json); // null

// trailing commas are not allowed
$bad_json = ' bar: "baz", ';
json_decode($bad_json); // null

【讨论】:

"null" 是有效的 JSON,但是它也会返回 null。只是吹毛求疵!【参考方案4】:

json_decode()json_last_error() 不适合您吗?您是否只是在寻找一种方法来表达“这看起来像 JSON”还是实际验证它? json_decode() 将是在 PHP 中有效验证它的唯一方法。

【讨论】:

【参考方案5】:

这是最好最有效的方法

function isJson($string) 
    return (json_decode($string) == null) ? false : true;

【讨论】:

【参考方案6】: $this->post_data = json_decode(stripslashes($post_data)); 如果($this->post_data === NULL) die( '"status":false,"msg":"post_data 参数必须是有效的 JSON"' );

【讨论】:

以上是关于delphi json 是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

GetTimeZoneInformation 的返回值对动态 DST 区域是不是也有效?

Delphi json解析相关

检查 JSON 和 XML 是不是有效? C#

正则表达式查找部分输入是不是为有效 JSON

检查来自 API 的响应是不是为有效 JSON

Java 检查字符串是有效的 JSON 还是有效的 XML,或者两者都不是