2012-11-26 94 views
0

的唯一鍵的值,我有一個JSON輸出這樣的代碼:合併JSON字符串

{"a":{"p1":"1"},"a":{"p2":"2"},"b":{"b1":"b2"}} 

如何將它轉換成以下使用JavaScript或jQuery的或php?

{"a":{"p1":"1","p2":"2"},"b":{"b1":"b2"}} 

編輯: 我這段代碼生成JSON代碼:

parts2.push('"'+$(this).attr('alt')+'":{"'+$(this).attr('title') + '"' + ":" + '"'+$(this).attr('value') + '"}'); 

但是$(本).attr( 'ALT')可能重複循環,我想,以防止重複鍵,而是將值附加到該密鑰

+0

你是怎麼得到不正確的JSON? – zerkms

+2

您的第一個輸出是有效的JSON,但您將無法使用Javascript獲得您需要的結果。第二個'a'鍵覆蓋第一個! – devnull69

+0

我添加了一些信息謝謝 – h0mayun

回答

4

對象的每個屬性應具有唯一的密鑰名稱。如果您嘗試使用重複的鍵名稱解析JSON,則只會使用最後一次出現的值,因此無法使用本機JSON.parse解析此數據,但仍希望保留數據。

根據您的編輯,可以防止重複不斷髮生:

var obj = {}; 

if typeof obj[$(this).attr('alt')] == "undefined" 
    obj[$(this).attr('alt')] = {}; 

obj[$(this).attr('alt')][$(this).attr('title')] = $(this).attr('value'); 
parts2.push(JSON.stringify(obj)); 
+1

嚴,爲什麼它**無效**?任何參考證明? – zerkms

+1

@zerkms Niul似乎找到了一個參考,如果你想看看。我意識到它可能會被認爲是'SHOULD',而不是'MUST',所以具有重複鍵名的JSON是有效的。 –

+0

你的代碼工作正常,但它不會附加第二個參數到發生的密鑰 – h0mayun

1

而是串起僞JSON,只需創建一個對象,填補和字符串化的對象,當你發送它:

var parts = {}; 
$('.foo')each(function() 
{//the loop, here parts is being filled 
    parts.[$(this).attr('alt')] = parts.[$(this).attr('alt')] || {};//initialize to object if property doesn't exist 
    parts.[$(this).attr('alt')] = [$(this).attr('title')] = $(this).attr('value'); 
}); 
//make JSON: 
partsJSON = JSON.stringify(parts); 
//{a:{p1:foo,p2:bar},b:{p3:foobar}} or something 
+0

你的代碼打破了我的整個code.maybe一些缺少的代碼? – h0mayun

+0

@ h0mayun:我不知道你對數據做了什麼,也不知道它來自哪裏,很可能是某個元素的'alt'或'title'屬性包含禁止的字符(破折號不允許在例如屬性名稱)...提供完整的代碼,然後編輯我的答案 –