更改JSON对象格式功能

时间:2016-10-12 12:35:20

标签: javascript json

我需要开发一个可以转换JSON格式的Javascript函数,如下所示。我不确定是否已经有用于此目的的javascript函数,或者我应该自己开发一个新函数

输入:(示例)

  {
            "event[id]": "1476258193",
            "event[creator]": "aziz",
            "event[title]": "event[title]",
            "event[review][thankyou]": "event[review][thankyou]",
            "event[review][teaser]": "event[review][teaser]"
    }

输出应该是这样的:

{
  Events: {
            Id: “1476258193”,
            Creator: “aziz”
            …..
            Review: {
                      Thankyou: “”,
                      Teaser: “”
}
}
}
编辑(解决方案):经过一些工作和其他用户的帮助,特别是“anied”我自己做了这个功能,如果有人对此感兴趣,那么这个功能不是100%最优,但是它做了什么应该做 https://plnkr.co/edit/4d6cDzHXpN3RAOAJD2F0?p=preview

    convert = function() {
  var obj = {
    "event[id]": "1476258193",
    "event[creator]": "smista",
    "event[title]": "event[title]",
    "event[crmid]": "event[crmid]",
    "event[responsible]": "event[responsible]",
    "event[location]": "event[location]",
    "event[ktr]": "event[ktr]",
    "event[description]": "event[description]",
    "event[targetgroup]": "event[targetgroup]",
    "event[learninggoals]": "event[learninggoals]",
    "event[status]": "offline",
    "event[issuu][html]": "event[issuu][html]",
    "event[group_by_threads]": "1",
    "event[timeblocks][0][lectures][0][persons][0]": "2",
    "event[timeblocks][0][lectures][0][persons][1]": "333333",
    "event[timeblocks][0][lectures][0][persons][2]": "3",
    "event[timeblocks][0][lectures][1][persons][0]": "44",
    "event[timeblocks][0][lectures][1][persons][1]": "444",
    "event[timeblocks][0][lectures][1][persons][2]": "4444",
    "event[participants]": "event[participants]",
    "event[review][thankyou]": "event[review][thankyou]",
    "event[review][teaser]": "event[review][teaser]"
  }

  var result = "Events : {";
  var mainKeyString = "" ;
  var mainKeys = [] ; 
  var keysCount = 0 ; 

  for (var k in obj) {
    if( obj.hasOwnProperty(k) ) {
      res = k.replace('event[', ''); 
      mainKeyString+= res ; 
    } 
  }
  mainKeyString = mainKeyString.replace(/\[/g,',');
  mainKeyString = mainKeyString.replace(/\]/g,',');
  mainKeyString = mainKeyString.replace(/,,/g,',');
  mainKeyString = mainKeyString.substring(0, mainKeyString.length-1);
  mainKeys = mainKeyString.split(',') ; 
    for (var i in obj) {
      if( obj.hasOwnProperty(i) ) {
        keysCount = (i.match(/\[/g) || []).length;
        var lastKey = keysCount -1 ; 
        for (j=0;j<keysCount;j++){
          if (keysCount >1 && j != lastKey){
            result += mainKeys[0] +": {"; 
          }
          else if (keysCount >1 && j == lastKey) {

              result += mainKeys[0] +":\""+obj[i] + "\"}";
          }
          else result += mainKeys[0] +":\""+obj[i] + "\",";
          mainKeys.shift() ; 
        }
      } 
  }
  document.getElementById("result").innerHTML = result;
}

1 个答案:

答案 0 :(得分:1)

你应该开发一些东西,因为我不知道存在类似的东西。您将需要编写一个递归方法,该方法迭代对象键并将属性添加到新的源对象。但是,一个难点是你还需要处理重复(我看到了一些)。如果您对键的格式有信心(它们只包含用于表示新属性的括号),那么您可以使用for...in循环(for key in yourobject编写一些迭代对象中的键的内容。并寻找substr(key.indexOf('['), key.indexOf(']')来追捕逻辑界限。祝你好运!