Javascript 如何在JavasScript中解析键/值对字符串,并用逗号分隔键/值对?
我希望能够解析一个sting,例如Javascript 如何在JavasScript中解析键/值对字符串,并用逗号分隔键/值对?,javascript,json,string,parsing,key-value,Javascript,Json,String,Parsing,Key Value,我希望能够解析一个sting,例如 'a=1, b="two", c=[1,"two", {"a":1}]' 转换为JSON字符串或Javascript对象,例如 { 答:1,, b:两个, c:[1,2,{a:1}] } 这个问题类似于and,但是用逗号分隔KV对是一个挑战,因为值本身可以有逗号 建议?现有的包?U可以使用正则表达式来完成这项工作,以确保用于分隔键/值对的逗号和用于值内部的逗号被识别 但是,如果您的字符串没有规范化,可能包含多个空格,或者如果在一个等于key的值中也有一个匹
'a=1, b="two", c=[1,"two", {"a":1}]'
转换为JSON字符串或Javascript对象,例如
{
答:1,,
b:两个,
c:[1,2,{a:1}]
}
这个问题类似于and,但是用逗号分隔KV对是一个挑战,因为值本身可以有逗号
建议?现有的包?U可以使用正则表达式来完成这项工作,以确保用于分隔键/值对的逗号和用于值内部的逗号被识别 但是,如果您的字符串没有规范化,可能包含多个空格,或者如果在一个等于key的值中也有一个匹配项,那么这也是很棘手的= 但更好的做法是规范化字符串,并确保在值本身中从不使用键/值分隔符。如果需要使用逗号分隔键/值,那么最好在将所有值添加到字符串之前替换所有值中的所有逗号,并在将字符串解析为JSON后,将它们替换回每个JSON值中的逗号 所以实际上这是一种非常糟糕的做法,为什么要使用它而不是改变问题的原因,那就是使用一个唯一的分隔符 工作示例,但这仅在原始字符串中的值中没有=字符时有效,但在使用正则表达式时也是如此
const input = 'a=1, b="two", c=[1,"two", {"a":1}]';
let arr = input.split(',');
let jsonString = '{';
arr.forEach(el => {
if (el.indexOf('=') > -1) {
const keyVal = el.split('=');
jsonString += `"${keyVal[0].replace(' ', '')}": ${keyVal[1]},`;
} else {
jsonString += `${el},`;
}
});
jsonString = jsonString.replace(/.$/,"}");
const jsonObject = JSON.parse(jsonString);
console.log(JSON.stringify(jsonObject));
您可以使用正则表达式来实现这一点,以确保用于分隔键/值对的逗号和用于值内部的逗号被识别 但是,如果您的字符串没有规范化,可能包含多个空格,或者如果在一个等于key的值中也有一个匹配项,那么这也是很棘手的= 但更好的做法是规范化字符串,并确保在值本身中从不使用键/值分隔符。如果需要使用逗号分隔键/值,那么最好在将所有值添加到字符串之前替换所有值中的所有逗号,并在将字符串解析为JSON后,将它们替换回每个JSON值中的逗号 所以实际上这是一种非常糟糕的做法,为什么要使用它而不是改变问题的原因,那就是使用一个唯一的分隔符 工作示例,但这仅在原始字符串中的值中没有=字符时有效,但在使用正则表达式时也是如此
const input = 'a=1, b="two", c=[1,"two", {"a":1}]';
let arr = input.split(',');
let jsonString = '{';
arr.forEach(el => {
if (el.indexOf('=') > -1) {
const keyVal = el.split('=');
jsonString += `"${keyVal[0].replace(' ', '')}": ${keyVal[1]},`;
} else {
jsonString += `${el},`;
}
});
jsonString = jsonString.replace(/.$/,"}");
const jsonObject = JSON.parse(jsonString);
console.log(JSON.stringify(jsonObject));
可以使用此正则表达式查找字符串中的所有键=值对:
([a-z]\w*)=((?:[^"]|"[^"]+")+?)(?=,\s*[a-z]\w*=|$)
它寻找一个标识符,我假设它们是一个字母,后跟一个或多个单词字符,您可以根据需要进行调整,后跟一个=,然后是一个非引号字符或引号字符串。然后,使用一个前瞻来断言后面跟着一个逗号、一些空格和一个带=、或字符串结尾的标识符
将该行拆分为键/值对后,您可以从中构造JSON元素,将所有元素连接到一个JSON字符串中并对其进行解析:
const str='a=1,b=two,c=[1,two,{a:1}]';
常量regex=/[a-z]\w*=?:[^]|[^]+??=,\s*[a-z]\w*=|$/g
让m;
设els=[];
而m=regex.execstr!==空的{
els.push`${m[1]}:${m[2]}`;
}
常量json='{'+els.join','+'}';
const obj=JSON.parsejson;
console.logobj 可以使用此正则表达式查找字符串中的所有键=值对:
([a-z]\w*)=((?:[^"]|"[^"]+")+?)(?=,\s*[a-z]\w*=|$)
它寻找一个标识符,我假设它们是一个字母,后跟一个或多个单词字符,您可以根据需要进行调整,后跟一个=,然后是一个非引号字符或引号字符串。然后,使用一个前瞻来断言后面跟着一个逗号、一些空格和一个带=、或字符串结尾的标识符
将该行拆分为键/值对后,您可以从中构造JSON元素,将所有元素连接到一个JSON字符串中并对其进行解析:
const str='a=1,b=two,c=[1,two,{a:1}]';
常量regex=/[a-z]\w*=?:[^]|[^]+??=,\s*[a-z]\w*=|$/g
让m;
设els=[];
而m=regex.execstr!==空的{
els.push`${m[1]}:${m[2]}`;
}
常量json='{'+els.join','+'}';
const obj=JSON.parsejson;
console.logobj;