将字符串转换为对象层次结构 [英] Convert string to object hierarchy

查看:301
本文介绍了将字符串转换为对象层次结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从API返回了以下字符串,并希望使用javascript将其转换为对象层次结构.

I have the following string returned from an API and I want to convert it to an object hierarchy using javascript.

收到的字符串是:

"paymentInfoList.paymentInfo(0).receiver.amount":"12.00"

我想将其转换为javascript对象,例如:

I want to convert it to a javascript object like:

{
    paymentInfoList: {
        PaymentInfo: [{
             receiver: {
                 amount: 12.0
             }
        }]
    }
}

我可以编写自己的解析器,但想知道那里是否已经有一些代码.

I could write my own parser but wonder if there is some code already out there.

更新

基于@JasonCust的答案,这里是一个解析器,用于解析来自PayPal Adaptive Payments Pay方法的完整响应: https://github.com/danielflippance/paypal-ap-parser

Based on the answer from @JasonCust here is a parser to parse a full response from the PayPal Adaptive Payments Pay method: https://github.com/danielflippance/paypal-ap-parser

推荐答案

我不知道现有的解析器可以处理这种格式.也许在Paypal的开发人员网站上有东西吗?如果您自己滚动,则可以使用类似下面的示例的递归函数来完成.我尚未对其进行彻底的测试,但这是一个很容易做到的POC.

I don't know of an existing parser that handles that format. Maybe something on Paypal's developer site? If you roll your own you could do so using a recursive function like the example below. I haven't tested it thoroughly but it's a POC that it's easy enough to do.

function setObjVal(obj, paths, val) {
  var path;
  var arrayInfo;

  if (paths.length === 0) {
    return val;
  }

  obj = obj || {};
  path = paths.shift();
  arrayInfo = path.match(arrayRegExp);

  if (arrayInfo) {
    path = arrayInfo[1];

    if (!Array.isArray(obj[path])) {
      obj[path] = [];
    }

    obj[path][arrayInfo[2]] = setObjVal(obj[path][arrayInfo[2]], paths, val);
  }
  else {
    obj[path] = setObjVal(obj[path], paths, val);
  }

  return obj;
}

var arrayRegExp = /^(\w+)\((\d+)\)$/;

var input = '"paymentInfoList.paymentInfo(0).receiver.amount":"12.00"';
var pair = input.split(':').map(function (str) { return str.replace(/"/g, ''); });
var newObj = setObjVal({}, pair[0].split('.'), pair[1]);

function setObjVal(obj, paths, val) {
  var path;
  var arrayInfo;
  
  if (paths.length === 0) {
    return val;
  }

  obj = obj || {};
  path = paths.shift();
  arrayInfo = path.match(arrayRegExp);
  
  if (arrayInfo) {
    path = arrayInfo[1];
    
    if (!Array.isArray(obj[path])) {
      obj[path] = [];
    }
    
    obj[path][arrayInfo[2]] = setObjVal(obj[path][arrayInfo[2]], paths, val);
  }
  else {
    obj[path] = setObjVal(obj[path], paths, val);
  }
  
  return obj;
}

document.write('<pre>' + JSON.stringify(newObj, null, 4) + '</pre>');

或者,如果您想使用lodash,可以使用 _.set() :

Alternatively if you want to use lodash you could use _.set():

var newObj = _.set({}, pair[0].replace(/\(/g, '[').replace(/\)/g, ']'), pair[1]);

var input = '"paymentInfoList.paymentInfo(0).receiver.amount":"12.00"';
var pair = input.split(':').map(function (str) { return str.replace(/"/g, ''); });

var newObj = _.set({}, pair[0].replace(/\(/g, '[').replace(/\)/g, ']'), pair[1]);

document.write('<pre>' + JSON.stringify(newObj, null, 4) + '</pre>');

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.min.js"></script>

这篇关于将字符串转换为对象层次结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆