2017-06-12 174 views
4

可能是重複的問題,但無法找到答案。我想將包含一些JSON字符串的JavaScript對象串化爲值。JSON使用json字符串將對象字符串化爲值

例如:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"}; 

正如你看到的,關鍵 '選擇' 的值是一個JSON字符串。我想將對象'obj'字符串化,而不需要對內部JSON字符串進行雙重字符串化。

除了使用JSON字符串解析每個值並將對象字符串化以外,是否有任何干淨整潔的解決方案?

+0

唯一的清潔方式是爲了避免首先混合JSON和JavaScript對象。 – str

+1

我非常好奇你如何最終以JSON結構中的轉義JSON字符串結束。理想情況下,'obj.options'應該是JSON對象,而不是當前情況下的字符串。不幸的是,如果你不能改變它,但你知道哪些屬性是JSON,哪些不屬於,你可以在屬性上使用'JSON.parse()',替換字符串值,然後調用'JSON.stringify()'。 – KevinLH

+0

您是否知道對象的哪些屬性包含字符串化的JSON? – PeterMader

回答

1

不,你不能那樣做。
如果你沒有編碼該字符串,JSON.parse將不會返回正確的字符串。

最簡單的解決方案是使用JSON作爲obj.options,並在需要時使用它進行字符串化。

1

你可以做這樣的

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"}; 
 

 
var options =JSON.parse(obj.options); 
 

 
obj.options = options; 
 

 
console.log(obj);

0

在這種情況下,你需要分析optionsJSONObject第一。 爲此,您可以使用以下兩種方法:

方法1:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"}; 
obj.options = JSON.parse(obj.options); 
console.log(JSON.stringify(obj)); 

方法2:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"}; 

var result = JSON.stringify(obj, function(key, val) { 
    if (key === "options"){ 
      return JSON.parse(val); 
     }else{ 
      return val; 
     } 
}); 

console.log(result); 

現在,這將stringifyoptions只有一次。

+0

「to JSON」 - ** from ** not ** to **! – Quentin

0

假設您不知道哪些屬性是JSON,那麼可以使用JSON.stringify上的replacer函數參數來檢查值是否是JSON字符串。下面的例子試圖解析在try..catch內的每個字符串,所以是不是最有效的,但應該做的伎倆(嵌套性以及)

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"}; 
 

 
function checkVal(key,val){ 
 
\t if(typeof val === 'string'){ 
 
\t \t try{return JSON.parse(val);}catch(e){} 
 
    } 
 
    return val; 
 
} 
 

 
var res = JSON.stringify(obj,checkVal); 
 

 
console.log('normal output', JSON.stringify(obj)) 
 
console.log('with replacer', res);