Perl data into JSON and YAML
2025-10-13 perl yaml json trace JSON::XSI needed to build simple perl data structure and provide users formats how they can specify it themselves. The structure looks like this:
my $data = [
{ doctype => 'SRS',
elements => [
{ name => 'srs01.md',
trace => [
{ name => 'SRS_001',
tags => {allocation => 'SW'},
},
{ name => 'SRS_002',
tags => {allocation => 'HW'}
}
]
}
]
},
{ doctype => 'SRD',
elements => [
{ name => 'srd01.md',
trace => [
{ name => 'SRD_001',
source => 'SRS_001',
}
]
}
]
}
];
It is a list of categories (doctype
) with elements related to them. Each element contains tracing in form of textual anchors like SRS_001
and connection between them via source
tag.
Here is simple code to emit it into a JSON file:
use JSON::XS;
my $json_coder = JSON::XS->new->ascii->pretty->canonical;
print $json_coder->encode($data);
The coder is setup to be output ASCII output (ascii
), nicely format it (pretty
) and sort keys (canonical
) in hashes to have stable output. The result is like this:
[
{
"doctype" : "SRS",
"elements" : [
{
"name" : "srs01.md",
"trace" : [
{
"name" : "SRS_001",
"tags" : {
"allocation" : "SW"
}
},
{
"name" : "SRS_002",
"tags" : {
"allocation" : "HW"
}
}
]
}
]
},
{
"doctype" : "SRD",
"elements" : [
{
"name" : "srd01.md",
"trace" : [
{
"name" : "SRD_001",
"source" : "SRS_001"
}
]
}
]
}
]
Other option is to use YAML:
use YAML;
print YAML::Dump($data);
The result is somewhat more concise and nicer, perhaps:
---
- doctype: SRS
elements:
- name: srs01.md
trace:
- name: SRS_001
tags:
allocation: SW
- name: SRS_002
tags:
allocation: HW
- doctype: SRD
elements:
- name: srd01.md
trace:
- name: SRD_001
source: SRS_001