如何从json对象获取具有数组列表的字符串的值

时间:2018-12-26 16:25:13

标签: javascript json string

我有这个json

var json = { 
    "I:5.3": {
        "conf": {
            "name": "Jack" 
        }
    }
}

和这个字符串

var str = '["I.5.3"]["conf"]'

如何从

这样的json获取str值
json["I.5.3"]["conf"]

我有json对象和str,我必须提取类似

json[str] = json["I.5.3"]["conf"]

3 个答案:

答案 0 :(得分:0)

您的标题表明您希望获得:

  • 字符串的值。
    • 其中有一个数组列表。
  • 来自JSON对象。

但是,您显示的所有代码都是一个普通的JavaScript对象。没有数组可见...而且我只能找到的字符串值是“ Jack”。

杰克将被提取为json["I.5.3"]["conf"]["name"]。 或通过点符号=> const obj = json["I.5.3"]; const nameValue = obj.conf.name; // => Jack

答案 1 :(得分:0)

我相信,您必须将字符串分成多个单独的部分。

var str = '["I.5.3"]["conf"]';
var identifiers = str.split('][');
// identifiers would be an array like:
// ["I.5.3", "conf"]

var person = json[identifiers[0]][identifiers[1]];
// person = {
//   "name": "Jack"
// }

String.prototype.split()允许您将字符串的各个部分分成一个数组。查看MDN文档以了解有关该特定方法的更多信息。

这个特定的答案希望您将始终分割属性 ,如果缺少这些属性,则会出错。为了安全起见,建议您在尝试访问该对象之前先检查该对象是否包含所需的属性。

var str = '["I.5.3"]["conf"]';
var identifiers = str.split('][');

try {
  var myVal;
  // Let's check if the property exists.
  if (Object.prototype.hasOwnProperty.call(json, identifiers[0]){
    myVal = json[identifiers[0]];

    if (Object.prototype.hasOwnProperty.call(myVal, identifiers[1]){
      myVal = myVal[identifiers[1]];
    }
  }
} catch(error) {
  // One of the properties didn't exist or something went wrong in the try
  // block above.
}

编辑: 以下内容将专门格式化您的字符串以符合匹配条件,从而成为一个数组。如果每个数组项中的任何地方都有单引号或双引号,则可能会出现这种情况,因此请注意。

var myArray = str.slice(2, -2).split('][').map(function(item) {
  return item.replace('"', '');
});

String.prototype.slice()提取字符串的一部分并将其作为新字符串返回,而无需修改原始字符串。

然后split方法将其分为不同的数组项。然后,我们遍历数组中的每个项目并删除其他"。再说一遍,如果原始字符串看起来像['one']['two'],这将崩溃。如果字符串看起来像["can't"]["won't"],那么这也不可靠。因此,请注意您的特定情况。如果您确定该字符串将始终符合您上面的格式,那么您可以依靠它。

答案 2 :(得分:0)

您有2种方法(至少现在是我的想法):

第一种方法

var json = { 
    "I:5.3": {
        "conf": {
            "name": "Jack" 
        }
    }
}
var str = '["I:5.3"]["conf"]'
var scr_line = 'json'+str;
var target = eval(scr_line);

console.log(target);

第二种方式:

var json = { 
    "I:5.3": {
        "conf": {
            "name": "Jack" 
        }
    }
}
var str = '["I:5.3"]["conf"]';
let ret = getVal(json, str);
console.log(ret);

function getVal(obj, path){
  var regex = /\["(.*?)"\]/mg;
  let m;

  while ((m = regex.exec(path)) !== null) {
      // This is necessary to avoid infinite loops with zero-width matches
      if (m.index === regex.lastIndex) {
          regex.lastIndex++;
      }
      
      if(typeof obj[m[1]] !== 'undefined') obj = obj[m[1]];
      else return obj[m[1]];
  }
  return obj;
}

我希望使用第二个,因为它会检查对象上的属性是否存在