合并json字符串的唯一键值

时间:2012-11-26 11:02:45

标签: php javascript jquery 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') + '"}' );

然而$(this).attr('alt')可能在循环中重复,我想防止重复键,而是将值附加到该键

3 个答案:

答案 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