Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对配置文件使用JSON。如何包括对重写的评论?_Json_Perl - Fatal编程技术网

对配置文件使用JSON。如何包括对重写的评论?

对配置文件使用JSON。如何包括对重写的评论?,json,perl,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

我正在尝试使用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实现,或者是否有其他配置文件格式更适合于此?

根据“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
  }
}

维护和修改配置文件并保持包括注释在内的秩序是一项相当困难的任务。请参见此系统的示例。根据示例代码,这并不像您期望的那么简单。例如,Augeas使用一种称为的技术


其主要思想是编写新的/自己的/特殊的解析器,它只在内容的语义后面存储额外的信息。它表示行号、确切的行位置、注释、使用的确切语法变量(如转义码与字符、单引号与双引号、使用的数字基数、浮点格式)。然后使用此信息返回序列化。透镜只是编写这种解析器的一种非常优雅的方式。您编写的lens代码可以同时充当解析器和序列化程序。

好主意,但我想知道如何保持顺序正确?当我使用
canonical
格式重写时,所有键都被排序,这意味着注释也将被排序,这是不需要的..JSON对象是显式无序的。