我有一个像这样的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') + '"}' );
然而$(this).attr('alt')可能在循环中重复,我想防止重复键,而是将值附加到该键
答案 0 :(得分: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 :(得分:2)
您应该在生成JSON字符串之前合并该值,或者您必须自己实现JSON解析器来解析JSON。
在http://www.ietf.org/rfc/rfc4627.txt?number=4627中:
对象中的名称应该是唯一的
答案 2 :(得分: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