从长JSON字符串中提取整数的简单方法是什么?
这是非常复杂的,长(几KB),用眼睛扫描似乎是不可能的。 只提取数字也不好,因为我需要跳过很多花车。 我知道我可以将JSON转换为对象并枚举,但这似乎有点过分,因为它可能包含对象,数组,对象内的对象等。
过滤一些整数会很好,例如我需要2000到20000之间的数字。 我需要这个来分析正在运行的程序的中间状态。不仅我的代码正在编写这些数据,所以我只能扫描现有的结构。
答案 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:性能还有待测试!我不确定你的输入字符串是什么样的,有多大。