从JSON字符串中提取整数?

时间:2013-05-01 08:09:15

标签: javascript

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

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

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

2 个答案:

答案 0 :(得分:1)

如果没有先看到数据示例,就不容易给出答案。

有两种方法可以为您提供JSON字符串的格式,即“固定列格式”或“逗号分隔”(实际上“分隔”可以是用于标识数据分离的任何重复字符)。 / p>

在这两种情况下,如果您知道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
    }
}

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

祝你好运。

答案 1 :(得分: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));

P.S:性能还有待测试!我不确定你的输入字符串是什么样的,有多大。