我熟悉decode_json()函数,该函数尝试解码JSON字符串,如果不能这样做,则会错误地终止Perl程序 - 但这个问题与该函数无关.
我想要的是这个---我想要一个函数,通过它我可以运行一个JSON字符串,该函数只是告诉我JSON字符串是否是犹太教 - 如果它不是犹太教,请给我详细信息这有什么问题.
有这样的功能吗?如果是这样,这里有人可以指出我正确的方向吗?
该功能也并不需要JSON字符串解码-它只是需要通知调用程序,如果JSON字符串可以被解码-并允许调用程序继续不分胜负它的运行.
如果事情是错误的字符串-我需要知道的只是些什么样的它是错误的,但在那里字符串中的错误是---包括哪些行号如果字符串是被解释为全内容一个文件.简而言之,这些信息对于调试从中读取字符串的JSON文件很有用.
decode_json()呱呱叫错了.eval如果需要以编程方式使用数据,可以通过包装或使用Try :: Tiny 来捕获该错误.croak错误消息显示json解析器失败的位置.
$ perl_scalar = decode_json $ json_text
与encode_json相反:期望UTF-8(二进制)字符串并尝试将其解析为UTF-8编码的JSON文本,并返回结果引用.呱呱叫错了.
http://search.cpan.org/~mlehmann/JSON-XS-3.01/XS.pm#FEATURES
#!/usr/bin/env perl
use JSON qw(decode_json);
my $maybe_json = '{"foo":"bar", "baz"}'; # invalid, baz key is missing value
my $json_out = eval { decode_json($maybe_json) };
if ($@)
{
print "decode_json failed, invalid json. error:$@\n";
}
Run Code Online (Sandbox Code Playgroud)
生产:
decode_json failed, invalid json. error:':' expected, at character offset 19 (before "}") at ./foo.pl line 6.
Run Code Online (Sandbox Code Playgroud)
解密解码失败消息可能令人沮丧地困难.
这个很容易,因为我们知道它是由一个没有值的键引起的,所以解析器抱怨它没有:在char 19中找到它所期望的.它还添加了有用的'before'}"'消息来帮助人类解释错误.
有一种方法可以自动解析错误消息并显示更大的输入字符串块.
让我们快速python转移,json解析器提供更有用的错误吗?不,它只显示char 19,甚至没有"before}"上下文.
>>> import json
>>> maybe_json = '{"foo":"bar", "baz"}'
>>> json.loads(maybe_json)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/andrew/anaconda/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/Users/andrew/anaconda/lib/python2.7/json/decoder.py", line 365, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/andrew/anaconda/lib/python2.7/json/decoder.py", line 381, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting : delimiter: line 1 column 20 (char 19)
Run Code Online (Sandbox Code Playgroud)
那么,最终的答案是什么?json解析器规范非常简单,如果出现错误,则退出.调用解析器,如果成功,则字符串有效,否则显示用户死亡的地方并询问该怎么做.Perl的json解析器还允许选择更轻松的翻译,例如将单引号(非法)解释为双引号(有效).请参阅relaxed和allow_singlequote选项.
也许你想要一个短绒?
这称为“linting”。CPAN上有一个非常好的JavaScript Linter包:JavaScript::JSLint
来自文档;
use JavaScript::JSLint;
my @errors = jslint($javascript);
for my $err (@errors) {
print "$err->{reason} at line $err->{line}\n";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4072 次 |
| 最近记录: |