解析具有key = value对的字符串作为JSON

时间:2015-08-20 19:39:47

标签: javascript json

我的节点应用以pipeline: function(userContext, options, done){ var nestedPromises = options.data.map.forEach(function(store, index){ return store.orders.map(function(order){ return new Promise(function(resolve, reject){ shopify.getPipeline(userContext, {'order':order,'storeId':index}, function(result){ var snapshotId = "30775bf1bb854c5d84c9c2af37bc8fb0"; var resourceToQuery = config.structrUrls.getUrl("ConfigurationSnapshot") + '/' + snapshotId ; var requestOptions = { method: "GET", timeout: 8000 }; requestify.request(resourceToQuery, requestOptions) .then(function(snapshotResult){ result.snapshots = snapshotResult.getBody().result; result.snapshots.configurationPayload = JSON.parse(snapshotResult.getBody().result.configurationPayload); resolve(result); }) .catch(function(err){ reject(err); }); }); }); }); }); // Flatten nested array. var promises = Array.prototype.concat.apply([], nestedPromises); Promise.all(promises).then(function(orderData){ done(null, orderData); }).catch(function(err){ done(err); }); } 格式接收一系列字符串(即包含多个以空格分隔的"a=x b=y c=z"对的字符串)。

将此类字符串转换为key=value形式的JSON对象的最佳方法是什么?

我打赌这是一个单线解决方案,但还没有设法找到它。

感谢。

7 个答案:

答案 0 :(得分:2)

一种方法是将替换为,,将=替换为:

var jsonStr = '{' + str.replace(/ /g, ', ').replace(/=/g, ': ') + '}';

或者如果您需要围绕键和值的引号:

var jsonStr2 = '{"' + str.replace(/ /g, '", "').replace(/=/g, '": "') + '"}';

JSON.parse()如果你需要的话。

示例输出:

str:      a=x b=y c=z
jsonStr:  {a: x, b: y, c: z}
jsonStr2: {"a": "x", "b": "y", "c": "z"}

答案 1 :(得分:1)

这是一个简单的功能,可以解决这个问题

function stringToObj (string) {
  var obj = {}; 
  var stringArray = string.split(' '); 
  for(var i = 0; i < stringArray.length; i++){ 
    var kvp = stringArray[i].split('=');
    if(kvp[1]){
     obj[kvp[0]] = kvp[1] 
    }
  }
  return obj;
}

答案 2 :(得分:0)

John Bupit's excellent answer的基础上,我进行了一些进一步的改进,最终得到以下内容(正在解析的字符串位于message中):

var json = JSON.parse(('{"' + message.replace(/^\s+|\s+$/g,'').replace(/=(?=\s|$)/g, '="" ').replace(/\s+(?=([^"]*"[^"]*")*[^"]*$)/g, '", "').replace(/=/g, '": "') + '"}').replace(/""/g, '"'));

基本上该计划如下:

  1. 首先replace():修剪任何前导或尾随空格 - 相当于trim()
  2. 第二个replace():为完全丢失的任何值添加双引号(空字符串)(例如key1= key2=val转到key1="" key2=val)。
  3. 第三个replace():用", "替换每个空格(用作分隔符),但,其中空格在双引号内(即字符串值的一部分) )。
  4. 第四个replace():将每个=替换为": "
  5. 按如下方式将整个字符串换行:{"..."}
  6. 最后,替换上述步骤创建的任何双引号""(因为值字符串已用message中的引号括起来),并带有单引号"
  7. 最后,在结果上运行JSON.parse()
  8. 上述方案应该处理缺失值,其中一些值被引用,一些未引用,并且值字符串中有空格,例如:类似于a= b="x" c="y y" d=z

答案 3 :(得分:0)

newstr = ""
for kvp in @value.split(" ")
  newstr += kvp.replace(/=/,'":"').replace(/^/, '"').replace(/$/, '"').replace(/\"\"/,'" "')

newstr = newstr.replace(/\"\"/g, '","')
jsn = JSON.parse('{' + newstr + '}')

答案 4 :(得分:0)

假设您没有以该格式获得嵌套对象:

var sample = 'a=x b=y c=z';
var newobj = {};
sample.split(' ').forEach(function (value) {
    var keypair = value.split('=');
    newobj[keypair[0]] = keypair[1];
});
console.dir(newobj);

这样做是在每个空白区域上拆分并推送到数组,并且数组循环并且数组中的每个项目再次被拆分以获得分配给newobj的每个键值对。

答案 5 :(得分:0)

我创建了一个类似需求的简单在线工具:https://superal.github.io/online-tools/

用例
传输从chrome网络请求(表单数据或查询字符串参数)或邮差标题键值(批量编辑样式)复制到json格式的键:值对。

例如
key:值对

platform:2
limit:10
start_time:1521561600
end_time:1522080000
offset:0

到json格式

{
  "platform": "2",
  "limit": "10",
  "start_time": "1521561600",
  "end_time": "1522080000",
  "offset": "0"
}

答案 6 :(得分:0)

可以使用这个 npm athena-struct-parser 包的帮助来解析(转换为 json)。

有关软件包的更多信息 -- https://www.npmjs.com/package/athena-struct-parser

示例 Nodejs 代码

var parseStruct =require('athena-struct-parser') ;
var str = '{description=Check the Primary key count of TXN_EVENT table in Oracle, datastore_order=1, zone=yellow, aggregation_type=count, updatedcount=0, updatedat=[2021-06-09T02:03:20.243Z]}'
var parseObj = parseStruct(str)
console.log(parseObj);

采用key=value格式的示例字符串

   {description=Check the Primary key count of TXN_EVENT table in Oracle, datastore_order=1, zone=yellow, aggregation_type=count, updatedcount=0, updatedat=[2021-06-09T02:03:20.243Z]}

结果解析输出

{
  description: 'Check the Primary key count of TXN_EVENT table in Oracle',
  datastore_order: '1',
  zone: 'yellow',
  aggregation_type: 'count',
  updatedcount: '0',
  updatedat: [ '2021-06-09T02:03:20.004Z' ]
}