我需要美化一些 JSON 以在 HTML 中显示 <pre>
部分。
我使用的工作 JavaScript 代码是..
function transformJson(k, v) {
if (k === 'href' && typeof v === 'string') {
var label = v.replace(/&/gi, '&');
return '<a href=' + v + '>' + label + '</a>';
}
return v;
}
function jsonFormat(jsonString) {
var jsonObj = JSON.parse(jsonString, transformJson);
return JSON.stringify(jsonObj, undefined, 2)
.replace(/\s"(\w*)":/g, ' "<span class="key">$1</span>":')
.replace(/:\s"(.*)"/g, ': "<span class="string">$1</span>"');
};
现在我想将所有属性键设置为第一级,无论属性值如何,都链接到“/documentation#attributeKeyText”。
var jsonToPrettify = {
"href": "link/me",
"nonHrefButMakeThisKeyALink": "some_text",
"obj": {
"href": "link/me",
"thisKeyWontBeALinkInsteadBecauseHasAParent": "some_text"
}
}
console.log( jsonFormat( JSON.stringify( jsonToPrettify ) ) );
我怎样才能实现这一目标? 如何检查当前属性没有父对象?
谢谢
更新:
当前版本的输出是:
{
"<span class="key">href</span>": "<span class="string"><a href=link/me>link/me</a></span>",
"<span class="key">nonHrefButMakeThisKeyALink</span>": "<span class="string">some_text</span>",
"<span class="key">obj</span>": {
"<span class="key">href</span>": "<span class="string"><a href=link/me>link/me</a></span>",
"<span class="key">thisKeyWontBeALinkInsteadBecauseHasAParent</span>": "<span class="string">some_text</span>"
}
}
所以我只想将跨度 nonHrefButMakeThisKeyALink 改为链接..
最佳答案
最顶层的对象被传递给 parameter for JSON.parse() 提供的函数在空键下。
您需要将其包含在 transformJson
中:
function transformJson(k, v) {
if (k === 'href' && typeof v === 'string') {
var label = v.replace(/&/gi, '&');
return '<a href=' + v + '>' + label + '</a>';
} else if (k === '') {
for (var x in v) {
//skipping 'href' because it's handled by previous 'if'
if (x !== 'href' && typeof v[x] === 'string') {
var label = v[x].replace(/&/gi, '&');
v[x] = '<a href=/documentation#' + x + '>' + label + '</a>';
}
}
}
return v;
}
关于javascript - 在第一层创建 JSON 属性键链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629895/