使用JSON配置文件。如何在重写中包含注释?

时间:2015-03-26 07:49:57

标签: json perl

我正在尝试使用JSON来保存和读取配置文件。我想在配置文件中选择使用注释。对于常规Perl注释,注释行应以井号#开头。

读取配置文件没问题,但是当我想在磁盘上回写时,所有注释都会丢失。例如:

use feature qw(say);
use strict;
use warnings;
use Data::Dump;
use JSON::XS;

my $json  = JSON::XS->new->relaxed->pretty->canonical;
my $str = '
{
  # Here we assign a value of 1 to a
  "a" : 1,
  "b" : {
     "c" : 3,  # and c should be equal to 3
     "d" : 4
  }
}
  ';
my $h = $json->decode($str);
#say $str;
#dd $h;
$h->{b}{a} = 2;
my $new_str = $json->encode($h);
say $new_str;

输出结果为:

{
   "a" : "1",
   "b" : {
      "a" : 2,
      "c" : "3",
      "d" : "4"
   }
}

而预期的输出是:

{
  # Here we assign a value of 1 to a
  "a" : 1,
  "b" : {
     "a" : 2,
     "c" : 3,  # and c should be equal to 3
     "d" : 4
  }
}

是否可以使用JSON实现,还是有其他更适合的配置文件格式?

2 个答案:

答案 0 :(得分:1)

根据Wikipedia," JSON不提供或允许任何类型的评论语法。"

也许您可以在数据中允许注释节点。类似的东西:

{
  "comment" : "# Here we assign a value of 1 to a",
  "a" : 1,
  "b" : {
     "a" : 2,
     "c" : 3, "comment" : "# and c should be equal to 3",
     "d" : 4
  }
}

答案 1 :(得分:1)

维护和修改配置文件并保持包含注释的顺序是一项非常艰巨的任务。请参阅Augeas作为此类系统的示例。根据您的示例代码,它并不像您期望的那么容易。例如,Augeas使用一种称为lenses的技术。

主要思想是编写新的/自己的/特殊的解析器,它只存储内容的语义背后的附加信息。它表示行号,确切的行位置,注释,如果存在的话,使用的确切语法变体(例如,转义代码与字符,单引号和双引号,使用的数字基数,浮点数的格式)。然后使用此信息进行序列化。镜头只是一种非常优雅的方式来编写这样的解析器。你可以一次编写代码作为解析器和序列化器的镜头。