json - 如何在 Perl 中验证 JSON?

标签 json perl

我熟悉的decode_json()函数尝试解码 JSON 字符串,并在失败时以错误方式终止 Perl 程序——但这个问题与该函数无关。
我想要做的是——我想要一个函数,通过它我可以运行一个 JSON 字符串,该函数将简单地告诉我 JSON 字符串是否是 kosher 的——如果它不是 kosher 的,请给我详细信息错了。
有这样的功能吗?如果是这样,这里有人能指出我正确的方向吗?
该函数不需要解码 JSON 字符串——它只需要通知调用程序是否可以解码 JSON 字符串——并允许调用程序继续运行而不管结果如何。
如果字符串有问题——我不仅需要知道它是什么类型的错误,还需要知道错误在字符串中的哪个位置——如果字符串被解释为文件的完整内容,还需要知道什么行号.简而言之,对调试从中读取字符串的 JSON 文件有用的信息。

最佳答案

decode_json()错误的咝咝声。您可以通过包装在 eval 中来捕获该错误。或者使用 Try::Tiny,如果您需要以编程方式使用数据。 croak 错误消息显示了 json 解析器失败的地方。

$perl_scalar = decode_json $json_text

The opposite of encode_json: expects an UTF-8 (binary) string and tries to parse that as an UTF-8 encoded JSON text, returning the resulting reference. Croaks on error.



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";
}

产生:
decode_json failed, invalid json. error:':' expected, at character offset 19 (before "}") at ./foo.pl line 6.

破译解码失败消息可能非常困难。

这个很简单,因为我们知道它是由一个没有值的键引起的,所以解析器提示它没有找到:它预期在字符 19。它还添加了有用的“before "}"” 消息以帮助人类解释错误。

有一种方法可以自动解析错误消息并显示更大的输入字符串块可能会很好。

让我们快速转换一下 Python,那个 json 解析器是否提供了更有用的错误?不,它只显示字符 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)

那么,最终的答案是什么? json 解析器规范非常简单,如果出现错误就退出。调用解析器,如果成功则字符串有效,否则向用户显示它在哪里死亡并询问该怎么做。 Perl 的 json 解析器还允许更轻松的翻译选项,例如将单引号(非法)解释为双引号(有效)。见 relaxedallow_singlequote选项。

也许你确实想要一个短绒绒?

关于json - 如何在 Perl 中验证 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705895/

相关文章:

ios - 如何忽略 codable 中的 nil json 值

perl - 为 start_server 和 starman 编写 init.d 脚本的最佳方法?

regex - 尝试在 Perl 中匹配两个都包含特殊字符的变量

linux - 将 Perl 命令输出到 shell 变量中

perl - Devel::Cover 合并 Perl 脚本和模块的覆盖率数据

json - 网络服务 : How much data is too much?

java - 冒号(:) within JSON data using Gson

json - 如何从 typescript 中的 json 获取串联键列表

javascript - 为什么 json 响应有方括号

regex - 为什么我的 Perl 正则表达式这么慢?