【问题标题】:Using JSON for configuration file. How to include comments on rewrite?使用 JSON 作为配置文件。如何在重写时包含评论?
【发布时间】:2015-03-26 20:56:55
【问题描述】:

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

读取配置文件没有问题,但是当我想写回磁盘时,所有的cmets都丢失了。例如:

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 perl


    【解决方案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
      }
    }
    

    【讨论】:

    • 好主意,但我想知道如何保持排序正确?当我使用canonical 格式重写时,所有键都已排序,这意味着 cmets 也将被排序,这是不希望的..
    • JSON 对象是明确无序的。
    【解决方案2】:

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

    主要思想是编写新的/拥有的/特殊的解析器,它将附加信息存储在内容语义后面。它表示行号、确切的行位置、cmets、使用的确切语法变体(例如转义代码与字符、单引号与双引号、使用的数字基数、浮点格式)。然后将这些信息用于序列化回来。镜头只是编写此类解析器的一种非常优雅的方式。您编写的 lens 代码同时用作解析器和序列化器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      相关资源
      最近更新 更多