簡體   English   中英

Javascript將鍵值字符串解析為JSON

[英]Javascript Parsing Key Value String to JSON

我目前正在嘗試創建UDF,以將基於網絡流量的鍵值對字符串拆分為JSON。

我已經設法輸出了JSON對象,但是我希望能夠根據購買的產品數量或根據鍵的索引號動態添加嵌套項目。

僅查看產品時,字符串中始終只有一個產品。 僅當它的事務不止一次時,我認為符合json的結構,然后基於transactionid的存在來標識購買或視圖將是很好的。 例如:

購買的物品:

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 = pears&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));

提前致謝!!!

可能有一種更好的方法來完成此操作,但我只是在考慮時編寫了代碼

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

感覺到使用更好的param命名約定不會那么笨拙,但這是我的看法...

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"
    }]
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM