javascript - 在第一级创建JSON属性键链接

时间:2016-04-14 17:22:03

标签: javascript html json

我需要美化一些JSON以在HTML <pre>部分中显示。

我使用的工作javascript代码是..

function transformJson(k, v) {

  if (k === 'href' && typeof v === 'string') {
      var label = v.replace(/&/gi, '&amp;');
    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>"');
};

现在我想在第一级创建所有属性键,无论属性值如何,都链接到&#34; / documentation#attributeKeyText&#34;

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>"
  }
}

所以我只想将span nonHrefButMakeThisKeyALink 改为链接..

2 个答案:

答案 0 :(得分:1)

将最顶层的对象传递给在空键下以parameter for JSON.parse()提供的函数。 您需要在transformJson

中加入该内容
function transformJson(k, v) {
  if (k === 'href' && typeof v === 'string') {
    var label = v.replace(/&/gi, '&amp;');
    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, '&amp;');
        v[x] = '<a href=/documentation#' +  x  + '>' + label + '</a>';
      }
    }
  }
  return v;
}

答案 1 :(得分:0)

在JSON.parse之后简单地添加它就可以了。

var newObj = {};

for(var attr in jsonObj){
    if( jsonObj[attr].constructor != Object && attr != 'href'){
        newObj['<a href="/documentation#'+attr+'">'+attr+'</a>'] = jsonObj[attr];
    }else{
        newObj[attr] = jsonObj[attr];
    }
}

(然后很明显JSON.stringify应用于 newObj