【问题标题】:Parsing a colon-separated string into JSON in Node/Javascript在 Node/Javascript 中将冒号分隔的字符串解析为 JSON
【发布时间】:2015-05-21 00:40:07
【问题描述】:

我正在使用 Node 服务器,我使用 pdftk 从 PDF 中提取字段数据以注入表单数据。

我正在尝试获取字段名称的 JSON 对象以进行迭代,但我似乎无法正确处理。 它可能需要一个循环,因为它会根据 PDF 中的字段而改变。

这是我从输出中得到的字符串。

---
FieldType: Text
FieldName: topmostSubform[0].Page1[0].p1-t17[0]
FieldFlags: 8388608
FieldValue:
FieldJustification: Center
FieldMaxLength: 10
---
FieldType: Text
FieldName: topmostSubform[0].Page1[0].p1-t20[0]
FieldFlags: 8388608
FieldValue:
FieldJustification: Center
FieldMaxLength: 10
---
FieldType: Button
FieldName: topmostSubform[0].Page1[0].p1-cb7[0]
FieldFlags: 0
FieldValue:
FieldJustification: Left
FieldStateOption: 1
FieldStateOption: Off
---
FieldType: Text
FieldName: topmostSubform[0].Page1[0].p1-t38[0]
FieldFlags: 8388608
FieldValue:
FieldJustification: Center
---
FieldType: Text
FieldName: topmostSubform[0].Page1[0].p1-t50[0]
FieldFlags: 8388608
FieldValue:
FieldJustification: Left

你会推荐正则表达式吗?解决这个问题的最佳方法是什么?

【问题讨论】:

  • 先在\n---\n上拆分,得到一个字段字符串数组。然后拆分\n 上的每一个以获取属性字符串数组。然后将: 上的内容拆分为propertyvalue
  • 如果你可以使用 ES6,你可以试试JSON.parse('['+ yourStringHere .split('\n---\n').map(a=>'{'+a.replace(/(.*?)\: ?(.*)/g,'"$1":"$2"').replace(/\n/g,',')+'}').join(',')+']')。然后您需要将一些数字解析为数字……但我想您需要对其进行优化,以便区分字符串和代码(例如 CentertopmostSubform[0].Page1[0].p1-t50[0])。

标签: javascript json pdftk


【解决方案1】:

反复使用split 将其分解为各个组件:

var input = '---\n\
FieldType: Text\n\
FieldName: topmostSubform[0].Page1[0].p1-t17[0]\n\
FieldFlags: 8388608\n\
FieldValue:\n\
FieldJustification: Center\n\
FieldMaxLength: 10\n\
---\n\
FieldType: Text\n\
FieldName: topmostSubform[0].Page1[0].p1-t20[0]\n\
FieldFlags: 8388608\n\
FieldValue:\n\
FieldJustification: Center\n\
FieldMaxLength: 10\n\
---\n\
FieldType: Button\n\
FieldName: topmostSubform[0].Page1[0].p1-cb7[0]\n\
FieldFlags: 0\n\
FieldValue:\n\
FieldJustification: Left\n\
FieldStateOption: 1\n\
FieldStateOption: Off\n\
---\n\
FieldType: Text\n\
FieldName: topmostSubform[0].Page1[0].p1-t38[0]\n\
FieldFlags: 8388608\n\
FieldValue:\n\
FieldJustification: Center\n\
---\n\
FieldType: Text\n\
FieldName: topmostSubform[0].Page1[0].p1-t50[0]\n\
FieldFlags: 8388608\n\
FieldValue:\n\
FieldJustification: Left';

var fields = [];
var field_strings = input.split(/[\r\n]*---[\r\n]*/);
for (var i = 0; i < field_strings.length; i++) {
    if (field_strings[i] == '') { // Skip blank field at beginning
        continue;
    }
    var obj = {};
    var props_strings = field_strings[i].split('\n');
    for (var j = 0; j < props_strings.length; j++) {
        var keyvalue = props_strings[j].split(':');
        obj[keyvalue[0]] = keyvalue[1].trim();
    }
    fields.push(obj);
}
console.log(fields);

【讨论】:

  • 这是唯一的输出:[ { '---\r': undefined, FieldType: ' \r', FieldName: ' topmostSubform[0]\r', FieldFlags: ' 0\r', FieldValue: ' \r', FieldJustification: ' Left\r', FieldMaxLength: ' 10\r', FieldStateOption: ' Off\r', '': undefined } ]
  • 您的文件有\r\n 作为行分隔符,而不仅仅是\n。所以更改split()中使用的正则表达式
  • 非常感谢!有效。我确实不得不把 trim() 拿出来,因为它说它是在 undefined 上运行的。
  • 只有当你的行中没有 : 时才会发生这种情况。
  • 我刚刚将 .trim() 移动到我将它推入对象的位置。现在完美了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多