从长 JSON 字符串中提取整数的简单方法是什么?
它非常复杂,而且很长(几 KB),用眼睛扫描它似乎是不可能的。仅仅提取数字也不好,因为我需要跳过太多的浮点数。我知道我可以将 JSON 转换为对象并枚举,但这似乎有点过头了,因为它可能包含对象、数组、对象内的数组等。
过滤一些整数会很好,例如我需要 2000 到 20000 之间的数字。我需要它来分析正在运行的程序的中间状态。不仅我的代码在写这些数据,所以我只能扫描现有的结构。
从长 JSON 字符串中提取整数的简单方法是什么?
它非常复杂,而且很长(几 KB),用眼睛扫描它似乎是不可能的。仅仅提取数字也不好,因为我需要跳过太多的浮点数。我知道我可以将 JSON 转换为对象并枚举,但这似乎有点过头了,因为它可能包含对象、数组、对象内的数组等。
过滤一些整数会很好,例如我需要 2000 到 20000 之间的数字。我需要它来分析正在运行的程序的中间状态。不仅我的代码在写这些数据,所以我只能扫描现有的结构。
不先看数据示例就很难给出答案。
有两种方法可以为您提供 JSON 字符串的格式,即“固定列格式”或“逗号分隔”(实际上,“分隔”可以是用于识别数据分隔的任何重复字符)。
在这两种情况下,如果您知道 JSON 数据的创建者,您可以询问创建者哪个字段代表 JSON 字符串中的哪条数据。至少你会知道数据代表字符串的每个部分。
否则,艰苦的工作将开始查看字符串,以找到定义您要查找的数字的共同特征,例如分隔符、逗号、分号等或任何其他字符。如果这些不存在,您将需要在 JSON 字符串中查找模式,然后围绕它构建您的提取。
使用 jquery 进行逗号分隔(或任何其他常见字符)的示例是;
var numValue = jsonResults.split(",");
numValue.each(function (index, value) {
if (value > 1999 && value < 19999) {
//Do whatever you want with the data
}
}
固定列格式很困难,因为您需要计算数据在字符串中开始和结束的行和列位置,并围绕它构建模型。将内容复制并粘贴到文本文件中并进行查看将是该练习的开始。
祝你好运。
出色地。我假设您的 JSON 字符串到 JSON 对象的解析速度更快。我还假设您将 JSON 对象传递给以下函数iterateAndExtractInt
:
var out = new Array();
var idx = 0;
var isInt = function(input) {
return typeof input != 'number' ? false :
(!isNaN(parseInt(input))
&& (parseFloat(input) == parseInt(input)));
}
var isArray = function(input) {
return Object.prototype.toString.call(input) === '[object Array]';
}
var isObject = function(input) {
return Object.prototype.toString.call(input) === '[object Object]';
}
var iterateAndExtractInt = function(obj) {
return (function doJob(obj) {
var process = function(value) {
if(isInt(value)) { // Add your custom validation here to allow select values
out[idx++] = value;
}
if(isArray(value)) {
value.forEach(function(entry) {
process(entry);
})
}
if(isObject(value)) {
doJob(value);
}
};
for(var key in obj) {
process(obj[key]);
}
return out;
})(obj);
}
// our test input
var inp = {a: 1, b: 1.001, c: {a: 'str', b: '33'},
d: [2,3,4], e: [{a:[5], b:{a:[{s:6},
{c:[[[[[[7,8,9,{a:[10]}]]]]],11]}]}}]};
console.log(iterateAndExtractInt(inp));
PS:性能有待测试!我不确定您的输入字符串的外观和大小。