将自定义集合字符串转换为JSON格式

时间:2016-12-22 22:02:39

标签: javascript json

我需要像这样转换一个字符串。     {0:{ Value:"0413-0415" }, 1:{ Value:"1-7800 LBO" }, 2:{ Value:"1-7804" }, 3:{ Value:"1-7805" }}

成为Select2的JSON字符串,需要此格式。     [{ id: 0, text: 'enhancement', attr: 'abc' }

我想用id替换Value,如果存在描述则用文本替换描述。如果不是将值复制到文本以及ID。

所以上面会变成     [{ id: "0413-0415", text: "0413-0415"}]

我怎么能用javascript写这个?

通过编写此函数,我能够以我想要的格式返回一个字符串。

function parseData(data)
{
    data = data.replace('{','[');
    data = data.replace(/,$/,"") + "]";
var re = /\{.*?\}/g;
var index, len;
var m = data.match(re);

correctedData = '[';
for (var el in m) {

    m[el] = m[el].replace('Value','id');
    m[el] = m[el].replace('Description','text');
    if(!m[el].includes("text:"))
    {
    var n = m[el].lastIndexOf('}') -1;
    m[el] = m[el].substring(0,n) + ', ' + m[el].replace('{','').replace('id','text'); 
    }
    correctedData = correctedData + m[el] + ', '

}
correctedData = correctedData.trim().replace(/,$/, "");
correctedData = correctedData.replace(/"/g, "'");
correctedData = correctedData + ']';

return correctedData;
}

但是我知道这是返回一个字符串并且使用JSON.parse将无法工作,因为它表示它无效的json。我看了Select2并拿了他们的例子,这也是无效的json。它只是一个对象数组。如何让javascript将其视为数组而不是字符串。

JSFiddle我目前在哪里。 https://jsfiddle.net/pricejt/d681sfew/

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式并获取新对象的部分,这些对象可以在所需格式的数组中收集。

var regex = /(\d+):{ Value:"([^"]*)"/g,
    str = '{0:{ Value:"0413-0415" }, 1:{ Value:"1-7800 LBO" }, 2:{ Value:"1-7804" }, 3:{ Value:"1-7805" }}',
    m,
    data = [];

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    if (m.length >= 2) {
        data.push({ id: m[1], text: m[2] });
    }
}

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

我终于能够让这个工作了。最终结果在这里。 https://jsfiddle.net/pricejt/d681sfew/2/

function parseData(data)
{
var correctedData = [];
data = data.replace('{','[');
data = data.replace(/,$/,"") + "]";
var re = /\{.*?\}/g;
var index, len;
var m = data.match(re);

for (var el in m) {

    m[el] = m[el].replace('Value','"id"');
    m[el] = m[el].replace('Description','"text"');
    if(!m[el].includes("text:"))
    {
    var n = m[el].lastIndexOf('}') -1;
    m[el] = m[el].substring(0,n) + ', ' + m[el].replace('{','').replace('id','text'); 
    }
    correctedData.push($.parseJSON(m[el]));

}

return correctedData;
}