json - perl 解码和编码 json 保留顺序
问题描述
我在文本数据库字段中有一个 json 编码的图表配置,格式如下:
{"Name":[[1,1],[1,2],[2,1]],"Name2":[[3,2]]}
这些 ID 的第一个数字是另一个表的主键。我想在删除行时使用触发器删除这些条目,plperl 函数会很好,除非它不保留哈希的顺序并且顺序在这个项目中很重要。我能做什么(不改变 json 编码配置的格式)?注意:图表名称可以包含任何字符,因此很难使用正则表达式。
解决方案
您需要使用流式 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]]}]
推荐阅读
- django - 如何使用 django 应用程序与外部服务器通信?
- django - 如何根据 Django 模型上的其他字段为字段生成 aa 值?
- java - 无法在 Java MIDI 程序中更改乐器,InvalidMidiDataException:channel out of range
- java - 休眠中的递归查询
- react-native - WatermelonDB - 执行批量插入时出错
- flutter - 无法在颤振应用程序中为我的自定义形状边框设置渐变颜色
- google-cloud-tpu - 在 GPU 上训练的模型的 TPU 推理(Tensorflow 对象检测 API)
- android - Firebase 分析 - content_type 为空白或(未设置)
- java - Matcher.group() 正在返回预期结果的一部分。例如,网址“www.google.com”,我的匹配器正在返回“www”。
- xamarin - 我使用 CrossMediaManager 需要一些时间来播放来自 URL 的音频