将字符串转换为对象层次结构 [英] Convert string to object hierarchy
问题描述
我从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屋!