Skip to content

Instantly share code, notes, and snippets.

@frogcat
Created May 22, 2017 11:01
Show Gist options
  • Save frogcat/fa74c523a870d011e9105da982bdfbe9 to your computer and use it in GitHub Desktop.
Save frogcat/fa74c523a870d011e9105da982bdfbe9 to your computer and use it in GitHub Desktop.
構造化項目名と値のペアを JSON-LD インスタンスに変換する実験

構造化項目名と値のペアを JSON-LD インスタンスに変換する実験

{
"場所型>表記": "${name}",
"場所型>地理座標>緯度": "${latitude}",
"場所型>地理座標>経度": "${longitude}"
}
{
"@context": "http://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"表記": "${name}",
"地理座標": {
"緯度": "${latitude}",
"経度": "${longitude}"
}
}
{
"場所型>表記": "${name}",
"場所型>地理座標>緯度": "${latitude}",
"場所型>地理座標>経度": "${longitude}",
"場所型>地理識別子>": "${geonames}"
}
{
"@context": "http://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"表記": "${name}",
"地理座標": {
"緯度": "${latitude}",
"経度": "${longitude}"
},
"地理識別子": "${geonames}"
}
{
"状況型>表記": "家族構成",
"状況型>関与[1]>役割": "夫",
"状況型>関与[1]>説明": "世帯主",
"状況型>関与[1]>関与者>表記": "${夫}",
"状況型>関与[1]>関与者>名称[通称]>表記": "ほげほげ",
"状況型>関与[1]>関与者>名称[本名]>表記": "ああああ",
"状況型>関与[2]>役割": "妻",
"状況型>関与[2]>関与者>表記": "${妻}"
}
{
"@context": "http://imi.go.jp/ns/core/context.jsonld",
"@type": "状況型",
"表記": "家族構成",
"関与": [
{
"役割": "夫",
"説明": "世帯主",
"関与者": {
"表記": "${夫}",
"名称": [
{
"表記": "ほげほげ"
},
{
"表記": "ああああ"
}
]
}
},
{
"役割": "妻",
"関与者": {
"表記": "${妻}"
}
}
]
}
function mapping2jsonld(mapping) {
var json = {
"@context": "http://imi.go.jp/ns/core/context.jsonld"
};
for (var path in mapping) {
var parent = json;
path.split(">").forEach(function(token, i, array) {
var name = token;
var group = "";
if (token.match(/^(.+)\[(.+)\]$/)) {
name = RegExp.$1;
group = RegExp.$2;
}
if (i === 0) {
json["@type"] = name;
} else if (i < array.length - 1) {
parent = parent[name] || (parent[name] = {});
parent = parent[group] || (parent[group] = {});
} else {
parent[name === "" ? "@id" : name] = mapping[path];
}
});
}
var dig = function(node, depth) {
if (node["@id"] && Object.keys(node).length === 1 && depth > 0) return node["@id"];
for (var property in node) {
var object = node[property];
if (typeof object === "object") {
var list = [];
for (var group in object) list.push(dig(object[group], depth + 1));
node[property] = list.length === 1 ? list[0] : list;
}
}
return node;
};
return dig(json, 0);
}
const fs = require("fs");
var mapping = JSON.parse(fs.readFileSync(process.argv[2], "UTF-8"));
var jsonld = mapping2jsonld(mapping);
console.log(JSON.stringify(jsonld, null, " "));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment