【问题标题】:Convert string to JSON stringformat将字符串转换为 JSON 字符串格式
【发布时间】:2019-04-01 12:09:20
【问题描述】:

我有一个字符串,其中对象名称与字段名称用点分隔,如下所示:

{\"person.firstName\":\"Ahmed\",\"person.job\":\"Doctor\",\"products.packName\":\"antibiotic\",\"products.packSize\":\"large\"}}";

我想把它解析成json格式:

"{\"person\": {\"firstName\":\"Ahmed\",\"job\":\"Doctor\",},\"products\": {\"packName\":\"antibiotic\",\"packSize\":\"large\"}}";

有没有一种有效的算法?

【问题讨论】:

标签: javascript json string parsing


【解决方案1】:

也许这对你有帮助。

    var str='{\"person.firstName\":\"Ahmed\",\"person.job\":\"Doctor\",\"products.packName\":\"antibiotic\",\"products.packSize\":\"large\"}';
var newObj={}
var json=JSON.parse(str);
for (i in json) {
    var splt=i.split('.');
    var key=splt[0];
    var subkey=splt[1];
    if(!(key in newObj)) {
        newObj[key]={};
    }
    newObj[key][subkey]=json[i];

}
//if you need string use str or not use newObj
var str=JSON.stringify(newObj);
console.log(str);
console.log(newObj);
console.log(newObj.person);
console.log(newObj.person.firstName);
console.log(newObj.person.job);

【讨论】:

  • if(!(key in newObj)) { newObj[key]={}; } 是浪费空间和测试。由于您没有处理嵌套键,因此您根本不需要此测试,因为 newObj[key][subkey]=json[i]; 将覆盖任何现有对象
【解决方案2】:

假设左边可能有多个点

let parsedObj = JSON.parse(<..YOUR STRINGIFIED JSON..>);

let myObj = {};
Object.keys(parsedObj).forEach((key) => {
    let val = parsedObj[key];
    let subKeys = key.split(".");
    let currentRef = myObj;
    subKeys.forEach((subKey, idx) => {
        if(idx === subKeys.length - 1) {
            currentRef[subKey] = val;
        } else {
            currentRef[subKey] = currentRef[subKey] || {};
            currentRef = currentRef[subKey];
        }
    });
});

let finalString = JSON.stringify(myObj);

附:您的字符串最后似乎包含一个额外的}

【讨论】:

  • @mplungjan 你还有什么建议? currentRef 是用于对结果进行更深层次分配的同一变量。 currentRef = currentRef[subKey]; 有助于在不同深度使用相同的变量。
  • 啊,我明白了。道歉
猜你喜欢
  • 2013-02-04
  • 2020-09-09
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多