2013-05-01 165 views
0

什麼是從長JSON字符串中提取整數的簡單方法?從JSON字符串中提取整數?

這是非常複雜的,很長(幾KB),用眼睛掃描它似乎impossibe。 只是提取數字也不好,因爲我需要跳過這麼多的浮點數。 我知道我可以將JSON轉換爲對象並枚舉,但這看起來像是矯枉過正,因爲它可能包含對象,數組,對象等內的數組。

很好過濾一些整數,例如我需要2000和20000. 我需要這個來分析一個正在運行的程序的中間狀態。不僅我的代碼正在寫這些數據,所以我只能掃描現有的結構。

+3

你能至少張貼一段摘錄嗎? – Cyrille 2013-05-01 08:12:51

+0

爲什麼不只是解析JSON字符串並選擇你想要的部分並跳過那些不是整數的東西? – dtech 2013-05-01 08:33:36

+0

,因爲它可能包含對象,數組,對象等內的數組 – exebook 2013-05-01 08:42:02

回答

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:性能仍有待考驗!我不確定你的輸入字符串是什麼樣的,它有多大。

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 
    } 
} 

固定列格式是艱難的,因爲你需要計算其中的數據並開始在字符串中結束的行和列的位置,並建立你周圍的造型。將內容複製並粘貼到文本文件中並查看它將是該練習的開始。

祝你好運。