Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JavasScript中解析键/值对字符串,并用逗号分隔键/值对?_Javascript_Json_String_Parsing_Key Value - Fatal编程技术网

Javascript 如何在JavasScript中解析键/值对字符串,并用逗号分隔键/值对?

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的值中也有一个匹

我希望能够解析一个sting,例如

'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;