[挑战]JSON格式 与 Perl数据格式互转,按特定规则格式化

There's more than one way to do it!
https://metacpan.org http://perlmonks.org
头像
523066680
Administrator
Administrator
帖子: 464
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 51 times
Been thanked: 91 times
联系:

[挑战]JSON格式 与 Perl数据格式互转,按特定规则格式化

帖子 #1 523066680 » 2019年06月23日 20:21

具体的说是 Echarts.js 中使用的 JSON 格式
参考:https://www.echartsjs.com/examples/editor.html?c=area-stack

Code: [全选] [展开/折叠] [Download] (EchartsObject.js)
  1. option = {
  2.     title: {
  3.         text: '堆叠区域图'
  4.     },
  5.     tooltip : {
  6.         trigger: 'axis',
  7.         axisPointer: {
  8.             type: 'cross',
  9.             label: {
  10.                 backgroundColor: '#6a7985'
  11.             }
  12.         }
  13.     },
  14.     legend: {
  15.         data:['邮件营销','联盟广告','视频广告','直接访问','搜索引擎']
  16.     },
  17.     toolbox: {
  18.         feature: {
  19.             saveAsImage: {}
  20.         }
  21.     },
  22.     grid: {
  23.         left: '3%',
  24.         right: '4%',
  25.         bottom: '3%',
  26.         containLabel: true
  27.     },
  28.     xAxis : [
  29.         {
  30.             type : 'category',
  31.             boundaryGap : false,
  32.             data : ['周一','周二','周三','周四','周五','周六','周日']
  33.         }
  34.     ],
  35.     yAxis : [
  36.         {
  37.             type : 'value'
  38.         }
  39.     ],
  40.     series : [
  41.         {
  42.             name:'邮件营销',
  43.             type:'line',
  44.             stack: '总量',
  45.             areaStyle: {},
  46.             data:[120, 132, 101, 134, 90, 230, 210]
  47.         },
  48.         {
  49.             name:'联盟广告',
  50.             type:'line',
  51.             stack: '总量',
  52.             areaStyle: {},
  53.             data:[220, 182, 191, 234, 290, 330, 310]
  54.         },
  55.         {
  56.             name:'视频广告',
  57.             type:'line',
  58.             stack: '总量',
  59.             areaStyle: {},
  60.             data:[150, 232, 201, 154, 190, 330, 410]
  61.         },
  62.         {
  63.             name:'直接访问',
  64.             type:'line',
  65.             stack: '总量',
  66.             areaStyle: {normal: {}},
  67.             data:[320, 332, 301, 334, 390, 330, 320]
  68.         },
  69.         {
  70.             name:'搜索引擎',
  71.             type:'line',
  72.             stack: '总量',
  73.             label: {
  74.                 normal: {
  75.                     show: true,
  76.                     position: 'top'
  77.                 }
  78.             },
  79.             areaStyle: {normal: {}},
  80.             data:[820, 932, 901, 934, 1290, 1330, 1320]
  81.         }
  82.     ]
  83. };

Parser 的部分不自己写,使用现成的工具 —— JSON 模块
但会遇到一些格式约束的问题,比如有很多关键字没有带双引号,有很多是单引号,用正则做一些替换之后可以正确转换。

use Encode;
use File::Slurp;
use Data::Dump qw/dd dump/;
use JSON qw/encode_json decode_json from_json/;
STDOUT->autoflush(1);

my $s = read_file("original.json");

# 处理关键字未引用的问题
$s =~s/(\w+):/"$1":/g;
$s =~s/(\w+)\s+:/"$1":/g;

# 单引号转双引号
$s =~s/'/"/g;
$s =~s/option =//;
$s =~s/};/}/;

#print encode('gbk', decode('utf8', $s));
dd from_json($s, {utf8=>1});

要求是,输出 Perl 的数据格式时,该缩进的时候缩进,尽可能接近原来JSON的风格。在遇到一序列数组的时候,比如
data : ['周一','周二','周三','周四','周五','周六','周日'],不要每个数值都换行缩进:
legend => {
data => [
"\x{90AE}\x{4EF6}\x{8425}\x{9500}",
"\x{8054}\x{76DF}\x{5E7F}\x{544A}",
"\x{89C6}\x{9891}\x{5E7F}\x{544A}",
"\x{76F4}\x{63A5}\x{8BBF}\x{95EE}",
"\x{641C}\x{7D22}\x{5F15}\x{64CE}",
],
},


反过来,从 Perl 数据格式转为JSON,也要尽量接近最初该JSON的风格,这个输出要手写函数。
(JSON 的 encode_json 和 to_json 函数输出的效果都差很远,即使使用不同的参数。)

头像
523066680
Administrator
Administrator
帖子: 464
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 51 times
Been thanked: 91 times
联系:

Re: [挑战]JSON格式 与 Perl数据格式互转,按特定规则格式化

帖子 #2 523066680 » 2019年06月23日 20:30

这个是我自己打算折腾的,过阵子更新。


回到 “Perl”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客