首页 > 解决方案 > perl 解码和编码 json 保留顺序

问题描述

我在文本数据库字段中有一个 json 编码的图表配置,格式如下:

{"Name":[[1,1],[1,2],[2,1]],"Name2":[[3,2]]}

这些 ID 的第一个数字是另一个表的主键。我想在删除行时使用触发器删除这些条目,plperl 函数会很好,除非它不保留哈希的顺序并且顺序在这个项目中很重要。我能做什么(不改变 json 编码配置的格式)?注意:图表名称可以包含任何字符,因此很难使用正则表达式。

标签: jsonperlhash

解决方案


您需要使用流式 JSON 解码器,例如JSON::Streaming::Reader. 然后,您可以将 JSON 存储为键/值对数组,而不是散列。

您可能如何使用它的实际实现高度依赖于您的数据结构,但鉴于提供的简单示例......这里有一个简单的实现。

use strict;
use warnings;
use JSON::Streaming::Reader;
use JSON 'to_json';

my $s = '{"Name":[[1,1],[1,2],[2,1]],"Name2":[[3,2]]}';

my $jsonr = JSON::Streaming::Reader->for_string($s);

my @data;
while (my $token = $jsonr->get_token) {
    my ($key, $value) = @$token;
    if ($key eq 'start_property') {
        push @data, { $value => $jsonr->slurp };
    }   
}   

print to_json(\@data);

此脚本的输出始终为:-

[{"Name":[[1,1],[1,2],[2,1]]},{"Name2":[[3,2]]}]

推荐阅读