为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 将键值字符串解析为 JSON

Javascript 将键值字符串解析为 JSON

慕田峪4524236 2021-10-07 10:49:44
我目前正在尝试创建一个 UDF,以将基于 Web 流量的键值对字符串拆分为 JSON。我已经设法输出一个 JSON 对象,但我希望能够根据键的索引号购买或查看的产品数量动态添加嵌套项目。当仅查看产品时,字符串中始终只有一个产品。只有当它是一个交易时,它才不止一个,但我认为最好符合 json 的结构,然后根据交易 ID 的存在来识别购买或查看。例如:购买的物品:sessionid=12345&transactionid=555555&product1=apples&productprice1=12&product1qty=1&product2=pears&productprice2=23&product2qty=3&transactionamount=58输出应如下所示:[   {      "sessionid":12345,      "transactionid":555555,      "transactionamount":58   },   [      {         "productline":1,         "product":"apples",         "productprice":12,         "productqty":1      },      {         "productline":2,         "product":"pears",         "productprice":23,         "productqty":2      }   ]]查看的项目:sessionid=12345&product1=apples&productprice1=12&product1qty=1&product2=梨&productprice2=23&product2qty=3[   {      "sessionid":12345,      "transactionid":0,      "transactionamount":0   },   [      {         "productline":1,         "product":"apples",         "productprice":12,         "productqty":1      }   ]]结果我将能够从 JSON 解析为 SQL 表中的一致表。到目前为止,我尝试过的只是解析字符串,但在 SQL 中创建表并不理想,因为购买次数可能会有所不同:var string = "sessionid=12345&transactionid=555555&product1=apples&productprice1=12&product1qty=1&product2=pears&productprice2=23&product2qty=3&transactionamount=58";function splitstring(queryString) {    var dictionary = {};    if (queryString.indexOf('?') === 0) {        queryString = queryString.substr(1);    }    var parts = queryString.split('&');    for (var i = 0; i < parts.length; i++) {        var p = parts[i];        // Step 2: Split Key/Value pair        var keyValuePair = p.split('=');        var key = keyValuePair[0];        var value = keyValuePair[1];        dec_val = decodeURIComponent(value);        final_value = dec_val.replace(/\+/g, ' ');        dictionary[key] = final_value;    }    return (dictionary);}console.log(splitstring(string));提前致谢!!!
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

感觉使用更好的参数命名约定会不那么笨拙,但这是我的看法......


function parseString(string) {

    var string = string || '',

        params, param, output, i, l, n, v, k, pk;

    params = string.split('&');

    output = [{},

        []

    ];

    for (i = 0, l = params.length; i < l; i++) {

        param = params[i].split('=');

        n = param[0].match(/^product.*?([0-9]+).*/);

        v = decodeURIComponent(param[1] || '');

        if (n && n[1]) {

            k = n[1];

            output[1][k] = output[1][k] || {};

            output[1][k]['productline'] = k;

            pk = n[0].replace(/[0-9]+/, '');

            output[1][k][pk] = v;

        } else {

            output[0][param[0]] = v;


        }

    }

    output[1] = output[1].filter(Boolean);

    return output;

}


var string = "sessionid=12345&transactionid=555555&product1=apples&productprice1=12&product1qty=1&product2=pears&productprice2=23&product2qty=3&transactionamount=58";

console.log(parseString(string));

输出:


[

    {

        "sessionid": "12345",

        "transactionid": "555555",

        "transactionamount": "58"

    },

    [{

        "productline": "1",

        "product": "1",

        "productprice": "12"

    }, {

        "productline": "2",

        "product": "3",

        "productprice": "23"

    }]

]


查看完整回答
反对 回复 2021-10-07
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

可能有更好的方法来做到这一点,但我只是按照我的想法编写了代码


var string = "sessionid=12345&transactionid=555555&product1=apples&productprice1=12&product1qty=1&product2=pears&productprice2=23&product2qty=3&transactionamount=58";


function splitstring(queryString) {

    var dictionary = {};


    if (queryString.indexOf('?') === 0) {

        queryString = queryString.substr(1);

    }


    var parts = queryString.split('&');


    for (var i = 0; i < parts.length; i++) {

        var p = parts[i];

        // Step 2: Split Key/Value pair

        var keyValuePair = p.split('=');

        var key = keyValuePair[0];

        var value = keyValuePair[1];


        dec_val = decodeURIComponent(value);

        final_value = dec_val.replace(/\+/g, ' ');

        dictionary[key] = final_value;

    }


    return (dictionary);

}


function process(obj) {

    let i = 1;

    const products = [];

    while(obj.hasOwnProperty(`product${i}`)) {

        products.push({

            [`product`]: obj[`product${i}`],

            [`productprice`]: obj[`productprice${i}`],

            [`productqty`]: obj[`product${i}qty`]

        });

        delete obj[`product${i}`];

        delete obj[`productprice${i}`];

        delete obj[`product${i}qty`];

        ++i;

    }

    return [obj, products];

}

console.log(process(splitstring(string)));

顺便说一句,如果这是在浏览器中,那么splitstring可以“替换”为


const splitstring = string => Object.fromEntries(new URLSearchParams(string).entries());

var string = "sessionid=12345&transactionid=555555&product1=apples&productprice1=12&product1qty=1&product2=pears&productprice2=23&product2qty=3&transactionamount=58";


function process(string) {

  const splitstring = queryString => {

    var dictionary = {};


    if (queryString.indexOf('?') === 0) {

      queryString = queryString.substr(1);

    }


    var parts = queryString.split('&');


    for (var i = 0; i < parts.length; i++) {

      var p = parts[i];

      // Step 2: Split Key/Value pair

      var keyValuePair = p.split('=');

      var key = keyValuePair[0];

      var value = keyValuePair[1];


      dec_val = decodeURIComponent(value);

      final_value = dec_val.replace(/\+/g, ' ');

      dictionary[key] = final_value;

    }


    return (dictionary);

  };


  let i = 1;

  const obj = splitstring(string);

  const products = [];

  while (obj.hasOwnProperty(`product${i}`)) {

    products.push({

      [`product`]: obj[`product${i}`],

      [`productprice`]: obj[`productprice${i}`],

      [`productqty`]: obj[`product${i}qty`]

    });

    delete obj[`product${i}`];

    delete obj[`productprice${i}`];

    delete obj[`product${i}qty`];

    ++i;

  }

  return [obj, products];

}

console.log(process(string));


查看完整回答
反对 回复 2021-10-07
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信