0

从长 JSON 字符串中提取整数的简单方法是什么?

它非常复杂,而且很长(几 KB),用眼睛扫描它似乎是不可能的。仅仅提取数字也不好,因为我需要跳过太多的浮点数。我知道我可以将 JSON 转换为对象并枚举,但这似乎有点过头了,因为它可能包含对象、数组、对象内的数组等。

过滤一些整数会很好,例如我需要 2000 到 20000 之间的数字。我需要它来分析正在运行的程序的中间状态。不仅我的代码在写这些数据,所以我只能扫描现有的结构。

4

2 回答 2

1

不先看数据示例就很难给出答案。

有两种方法可以为您提供 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
    }
}

固定列格式很困难,因为您需要计算数据在字符串中开始和结束的行和列位置,并围绕它构建模型。将内容复制并粘贴到文本文件中并进行查看将是该练习的开始。

祝你好运。

于 2013-05-01T08:46:44.357 回答
0

出色地。我假设您的 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:性能有待测试!我不确定您的输入字符串的外观和大小。

于 2013-05-01T17:34:28.353 回答