2011-09-06 43 views
2

是否可以通過JSON對象執行復雜查詢?我對JavaScript或jQuery解決方案持開放態度,越容易越好。我在設想一種類似於LINQ或SQL的函數式編程語言。如何解析或查詢JavaScript中的複雜JSON

我不希望其他第三方庫或加載項。

UPDATE
從早期的答案的容貌,一個附加的將是必要的。在這種情況下,我更喜歡使用不需要安裝過程的附加組件。與軟件發佈一樣部署的東西(如jQuery)是好的(例如* .js文件集)。

回答

0

嗯... YQL做這種事情,但那將是第三方。

您可以與jQuery的$.grep(array,filterfn)方法

var newArr = $.grep(oldArr,function(elInArray,index){ 
    return elInArray.key === somevalue; 
}); 

過濾的陣列,當然可以使用一個正則表達式在那裏如果願意,也可以使用鍵內更復雜的條件,如檢查多個鍵,鍵,鍵內的數組等。

3

當你與它進行交互時,它不是一個「JSON對象」,它是一個JavaScript對象。 (「JSON對象」只存在於數據表示法中。)JavaScript本身並沒有任何高級函數式編程結構,因此您需要第三方庫來完成此類事情。 JavaScript幾乎只有屬性訪問器,一個運算符「這個對象是否有一個帶有這個名字的屬性?」 (in,hasOwnProperty)以及截至第五版(尚未得到廣泛支持),一些便利的陣列特定功能,如forEach,every,map, filter等。

+0

+1感謝 - 這是一些偉大的信息。 –

1

使用JSON.stringifyreplacer回調來實現這一點:

function replacer(match, offset, fullstring) 
    { 
    return replacer.str; 
    } 

replacer.str = "\u0022filterValues\u0022:[\u0022hi\u0022,\u0022bye\u0022]"; /* Use DOM node value */ 

var foo = JSON.stringify({ 
"Region": { 
    "filterField": "kw_Region", 
    "filterValues": [ 
     "aa", 
     "bb" 
    ] 
}, 
"ApplicationName": { 
    "filterField": "kw_ApplicationName", 
    "filterValues": [ 
     "aa", 
     "bb" 
    ] 
}, 
"IssueType": { 
    "filterField": "kw_IssueType", 
    "filterValues": [ 
     "aa", 
     "bb" 
    ] 
}, 
"Outage": { 
    "filterField": "kw_Outage", 
    "filterValues": [ 
     "aa", 
     "bb" 
    ] 
}, 
"Priority": { 
    "filterField": "kw_Priority", 
    "filterValues": [ 
     "aa", 
     "bb" 
    ] 
} 
}).replace(/"filterValues[^\]]+./g, replacer) 

下面是兩個JSON方法序列化和改造,stringifyparse一些文檔:

JSON .parse(source,reviver)

此方法解析JSON文本以生成對象或數組。它可以拋出一個SyntaxError異常。

可選的reviver參數是一個可以過濾和轉換結果的函數。它接收每個鍵和值,並使用其返回值而不是原始值。如果它返回它收到的內容,那麼該結構不會被修改。如果它返回undefined,那麼該成員將被刪除。

reviver最終會調用空字符串和最頂層的值來允許轉換最上面的值。一定要正確處理這種情況,通常通過返回提供的值,否則JSON.parse將返回undefined。

if (k === "") return v 

JSON.stringify(值,替換器,空間)

的字符串化方法產生從一個JavaScript值的JSON文本。如果value是一個對象或數組,則會遞歸訪問該結構以確定每個membr或元素的序列化。結構不能是週期性的。

找到對象值時,如果對象包含toJSON方法,則會調用其toJSON方法,結果將被字符串化。 toJSON方法不會序列化:它返回應該序列化的名稱/值對所表示的值,或者如果沒有序列化,則返回undefined。 toJSON方法將傳遞與該值關聯的鍵,並且這將綁定到持有該鍵的對象。

您可以提供一個可選替換方法。它將傳遞每個成員的鍵和值,並將其綁定到包含對象。從您的方法返回的值將被序列化。如果你的方法返回undefined,那麼該成員將被排除在序列化之外。

如果replacer參數是一個數組,那麼它將用於選擇要序列化的成員。它過濾結果,只有在替換者數組中列出的鍵的成員才被字符串化。

不具有JSON表示的值(例如未定義或函數)將不會被序列化。對象中的這些值將被丟棄;在數組中它們將被替換爲null。您可以使用替代函數來替換具有JSON值的替代函數。 JSON.stringify(undefined)返回undefined。

可選的空格參數會生成一個用換行符和縮進填充的值的字符串化,以便於閱讀。

如果space參數是非空字符串,那麼該字符串將用於縮進。如果空格參數是一個數字,那麼縮進將是那麼多空格。

var alias = {"Clark":"","phone":""}; 

function kryptonite(key) 
    { 
    var replacement = {}; 
    for(var cursor in this) 
    { 
    if(cursor in alias) 
     replacement[cursor] = this[cursor] 
    } 

    return replacement; 
    } 

var contact = { 
       "Clark":"Kent", 
       "Kal El":"Superman", 
       "phone":"555-7777" 
       } 

contact.toJSON = kryptonite; 
var foo = JSON.stringify(contact) // "{"Clark":"Kent","phone":"555-7777"}" 

參考