2011-03-30 124 views
15

我正在使用返回json的Web服務,並將json存儲在本地變量中。 JSON的代表一個簡單的業務對象,如:JSON.stringify,更改密鑰的大小寫

var entry = { 
    "FirstName": "John", 
    "LastName": "Doe", 
    .... 
}; 

外殼是這樣的,因爲它與.NET類的屬性名相匹配,按我們的命名慣例。

當更改這些屬性中的一些並傳回json時,web服務現在預計駱駝大小寫(再次,按照我們對方法參數的命名約定)而不是最初返回的pascal大小寫。

var entry = { 
    "firstName": "John", 
    "lastName": "Doe", 
    .... 
}; 

這當然不起作用。

我使用JSON.stringify將json作爲字符串發送回web服務,並且我正在查看是否有一種簡單的方法將密鑰更改爲駱駝大小寫。但是,它看起來像我只能使用替代參數來處理值。

我可以改變該類的序列化,但讓我們假裝這不是一個選項。有任何想法嗎?

謝謝。

+2

是否有任何理由不將JSON發送回Web服務作爲與最初返回的對象(無論是結構還是類)完全匹配的複雜類型?通過這種方式,可以調用方法參數幾乎任何你想要的,你不必玩對象屬性「重命名」? – iivel 2011-03-30 00:47:50

+0

修復後端。你的命名約定似乎對你不利,並且在命名約定中創建了不規則性,這不是命名約定應該做的。 – Thanatos 2011-03-30 00:48:25

回答

28

在寫入之前,可以使用JSON替換器切換鍵。

JSON.stringify(myVal, function (key, value) { 
    if (value && typeof value === 'object') { 
    var replacement = {}; 
    for (var k in value) { 
     if (Object.hasOwnProperty.call(value, k)) { 
     replacement[k && k.charAt(0).toLowerCase() + k.substring(1)] = value[k]; 
     } 
    } 
    return replacement; 
    } 
    return value; 
}); 

相反,您可以使用JSON reviver。

JSON.parse(text, function (key, value) { 
    if (value && typeof value === 'object') 
     for (var k in value) { 
     if (/^[A-Z]/.test(k) && Object.hasOwnProperty.call(value, k)) { 
      value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k]; 
      delete value[k]; 
     } 
     } 
     return value; 
    }); 

第二個可選參數是一個函數,使用作爲解析的一部分創建的每個值或要寫入的每個值調用該函數。這些實現只是對鍵進行迭代,而對任何具有大寫字母的第一個字母進行小寫處理。

沒有爲替代品和revivers文檔在http://json.org/js.html

可選齊磊參數是一個將被要求在最終結果的各個級別每個鍵和值的功能。每個值將被reviver函數的結果替換。這可以用於將通用對象改造爲僞類的實例,或將日期字符串轉換爲日期對象。

字符串方法可以採用可選替換函數。它將在結構中每個值的toJSON方法(如果有)之後調用。它將傳遞每個鍵和值作爲參數,並且這將被綁定到持有該鍵的對象。返回的值將被字符串化。

+0

我正在處理json對象,直到我將它發回Web服務進行更新,所以這不是說我必須接受json對象,然後再調用stringify,然後再解析它嗎? – ScottE 2011-03-30 00:39:14

+0

這是一個相當輝煌的答案。 – mVChr 2011-03-30 00:40:01

+0

@ScottE,是的。對不起,我有你的問題backeards。不需要重新分析。編輯包含stringify案例。 – 2011-03-30 00:45:24