2017-05-09 85 views
0

我正在使用的API使用base64編碼的ruby哈希(類似於json對象,但專用於ruby)迴應,該哈希已轉換爲在檢索到編碼字符串base64編碼需要替代eval()和替換字符串值的更好方法

,字符串從Javascript解碼時我得到了相同的形狀,因爲它起源於

// Decoded example String 
"{:example=>'string',:another_example=>'string'}" 

我能夠解析出服務器上的紅寶石字符串的字符串使用字符串替換和eval()ruby字符串到JSON對象,但我知道eval()是邪惡的。此外,沒有辦法處理將來可能彈出的任何其他鍵值對。

這應該如何重寫沒有eval和沒有直接的字符串替換?

var storedToken = base64url.decode(window.localStorage.authtoken).replace(':example=>', 'example:').replace(':another_example=>', 'another_example:') 
var parsedTokenString = JSON.stringify(eval('(' + storedToken + ')')) 
var newJsonObject = JSON.parse(parsedTokenString) 
+0

@SiddharthNand這裏沒有什麼比這裏更多的只是標題 – tsh

+0

改了標題以防萬一。 – aronlmin

+1

如果服務器在你的控制之下,通過'json'包中的'.to_json'將它轉換爲json應該是一個好主意。 – tsh

回答

1

更換,然後JSON.parse

const storedToken = "{:example=>'string',:another_example=>'string'}"; 
 
    
 
const json = storedToken 
 
    .replace(/:(\w+)/g, '"$1"') 
 
    .replace(/=>/g, ':') 
 
    .replace(/'/g, '"'); 
 

 
const obj = JSON.parse(json) 
 

 
console.log(obj);

你可能會想加強這件事,以免事情打破當字符串值包含的東西像:foo或轉義單引號。

但是,正如其他答案和評論中提到的那樣,您應該真正更改服務器以返回JSON,這很容易與Ruby的to_json

0

所以,你有喜歡的字符串:

"{:example=>'string',:another_example=>'string'}" 

,你想轉換成像(使用JSON)對象:

'{":example":"string", ":another_example":"string"}' 

這我不清楚,如果:example前結腸是屬性名稱的一部分,或者是一個表示屬性名稱的標記,我認爲它是名稱的一部分(但這很容易修改)。

正則表達式可以使用,但如果令牌是:

{ start of notation 
=> property name, value separator 
, property/value pair separator 
} end of notation 

然後一個簡單的語法/格式可能是這樣的:

function stringToJSON(s) { 
 

 
    var resultText = ''; 
 
    var tokens = { 
 
    '{' : '{', // token: replacement 
 
    '=>': ':', 
 
    ',' : ',', 
 
    '}' : '}' 
 
    }; 
 
    var multiTokens = { 
 
    '=': '=>' // token start: full token 
 
    }; 
 
    var buff = ''; 
 

 
    // Process each character 
 
    for (var i = 0, iLen = s.length; i < iLen; i++) { 
 

 
    // Collect characters and see if they match a token 
 
    buff = s[i]; 
 

 
    // Deal with possible multi-character tokens 
 
    if (buff in multiTokens) { 
 

 
     // Check with next character and add to buff if creates a token 
 
     // Also increment i as using next character 
 
     if ((buff + s[i + 1]) in tokens) { 
 
     buff += s[++i]; 
 
     } 
 
    } 
 

 
    // Now check in tokens 
 
    if (buff in tokens) { 
 
     // Tokens are always surrounded by ", except for first { and last } 
 
     // but deal with those at the end 
 
     resultText += '"' + tokens[buff] + '"'; 
 

 
     // Otherwise, deal with single characters 
 
    } else { 
 

 
     // Single quotes not allowed 
 
     if (buff == "'") buff = ''; 
 

 
     // Add buff to result 
 
     resultText += buff; 
 
    } 
 
    } 
 
    // Remove leading and trailing " 
 
    return resultText.replace(/^\"|\"$/g, ''); 
 
} 
 

 
var s = "{:example=>'string',:another_example=>'string'}"; 
 

 
console.log(stringToJSON(s)); 
 

 
// Convert to object 
 
console.log(JSON.parse(stringToJSON(s)));

你的字符串符號可能會更復雜,但我認爲你可以得到它的要點。您可能需要修剪令牌周圍的空白,但由於屬性名稱未被引號包圍,因此很難知道要保留什麼以及要丟棄什麼。您可以通過引用包括數據令牌,然後扔掉了引號字符,例如:

\=> 

可以被視爲字面「=>」,而不是一個令牌。

可以相當容易地添加更多的令牌和處理步驟。多字符標記可以變得有趣,特別是如果你轉到3或字符。

數組方法和正則表達式可用於令牌匹配和處理,但我認爲循環是開始獲取邏輯排序的好地方,糖可以稍後添加。