2012-03-02 80 views
1

我想用JS创建一个多级JSON字符串。创建一个多级JSON字符串

方案

3个国家,5和祖父有3个孩子这也为之有3个孩子,有5个朋友。

我从外部JSON文件中获取数据,看起来像这样。

{"countries":[ 
    { 
     "name":"USA", 

     "grandfathers":[ 
      { 
       "gFName":"Steve", 
       "grandfathersKid":[ 
        { 
         "gFKName": "Linda", 
         "kid": [{ 
          "name": "Steve JR", 
          "friends": [{ 
           "name": "Kriss|John|Martin|Steven" 
          }] 
         } 
         ] 
        } 

       ] 
      } 
     ] 
    } 
]} 

,现在我想存储一些国家在看起来完全一样在外部JSON文件所做的列表中的一个新的JSON列表和他们的亲属和朋友。我打算在后面的脚本中使用这个“自制”列表。

我给这家最初的反应是

var tree = new Array(); 

tree = {}; 


var countries = new Array(); 

countries[0] = "canada"; 
countries[1] = "USA"; 
countries[2] = "Mexico"; 
countries[0][0] = "Steve"; //Lives in Canada 
countries[0][0][0] = "Linda"; //Daughter of Steve 
countries[0][0][0][0] = "Steve JR"; // Kid of Linda 
countries[0][0][0][0][0] = "Kriss"; //Steves Friend 
... 


$.each(countries...function(index, value){ 
     tree[index].country = value; 

    $.each(grandfathers...function(key, value){ 
     tree[index].country[key].grandfather = value; 

} 

等等,但是这不给我我想要的结果。我究竟做错了什么?而采取每一件事都是更有效的方法?

第三编辑...

+1

'var tree = new Array(); tree = {};'可以被压缩到'var tree = {};'。你应该提供你想要的输入和输出的例子。你的问题似乎是创建适当的结构,而不是JSON(这只是'JSON.stringify(value)')。 – 2012-03-02 12:24:59

+0

我提供了一个例子! – Philip 2012-03-02 12:33:57

+0

这个例子没有意义。您正试图将值分配给字符串,就好像它们是数组一样。你实际上有什么输入?你真的想要什么JSON输出? – Quentin 2012-03-02 12:40:57

回答

2

这是你想要做的事吗?

var countries = $.map(oldCountries || [], function(country) { 
    return { 
     name: country.name, 
     people: $.map(country.grandfathers || [], function(gpa) { 
      return { 
       name: gpa.gFName, 
       children: $.map(gpa.grandfathersKid || [], function(parent) { 
        return { 
         name: parent.gFKName, 
         children: $.map(parent.kid || [], function(kid) { 
          return { 
           name: kid.name, 
           friends: kid.friends 
          }; 
         }) 
        }; 
       }) 
      }; 
     }) 
    }; 
}); 

我不确定如何处理friends节点。应该将其规范化为更有用的东西,还是要让它独立?

Fiddle演示技术。

+0

这就像一个魅力,非常感谢! 我现在只会离开朋友:) – Philip 2012-03-03 14:16:05

1

我想我们需要更多地了解您的需求。但一些事情,我在这里看到的是:

  • 您声明树并初始化它作为一个数组,然后立即重新初始化为
    空对象
  • 你是不是在这里创造的中间节点,如tree[index]但只是假设它们存在 。
  • 您正试图使用​​点属性 访问来分配对象的country[key]属性。

您能否提供国家结构和祖父的结构。它们是嵌套的吗?

最后,你想要什么输出格式?上面的代码暗示了它,但它仍然有点模糊。

编辑

那么,你想达到的结构是这样的?:

var countries = [ 
    { 
    name: "Canada", 
    people: [ 
     { 
      name: "Steve", 
      children: [ 
      { 
       name: "Linda", 
       children: [ 
       { 
        name: "Steve, Jr.", 
        friends: [ 
         { 
         name: "Kriss" 
         } 
         //, more friends 
        ] 
       } 
       //, more grandchildren 
       ] 
      } 
      //, more parents 
      ] 
     } 
     //, more grandparents 
    ] 
    } 
    //, more countries 
]; 
+0

我有一个JSON输入,看起来像这样。 { “国家”: { “名”: “USA”, “祖父”: { “gFName”: “史蒂夫”, “grandfathersKid”: { “gFKName” : “琳达”, “孩子”:[{ “名”: “史蒂夫JR”, “朋友”:[{ “名”: “KRISS |约翰|马丁|史蒂芬” 我希望能够将其中一些国家转让给我将在稍后使用的新JSON。 谢谢! – Philip 2012-03-02 12:53:57

+0

你的输出格式如何?上面的代码没有真正指定它。 – 2012-03-02 12:59:55

+0

没关系。我看到更新。 – 2012-03-02 13:03:11

0

听起来像是一门功课,所以我会尽力给你指出正确的方向。我认为你在混淆物体和数组。您可以使用“国家”对象和“人物”对象。一个国家对象应该有一系列的人物,作为居民。 Person对象可以拥有一组人对象作为后代。添加一个像“addDescendant”这样的方法,它可以创建一个人下的新人。从那里你可以建立你喜欢的结构。下面是一些伪代码:

countries = []; 
function Country(name){ this.name = name; this.population = [];} 
function Person(kids){this.descendants = []; this.addDescendant = function(){...}; 
    //loop from 1 to kids and add descendants as "new Person" 
} 
person = new Person(3); 
country1 = new Country("MyCountry1"); 
// now add people to country1.population 
countries.push(country1); 

最终的结构应该是这个样子:

countries = [ 
    { name: "country 1", 
     people: [{ name: "Steve"}, 
       {name: "Clara", descendants: [{name: "Clara's daughter"}, 
              {name: "Clara's son"}] 
       ]} 
    }, 
    { name: "country 2", 
     people: [{}, {} ...] 

    } 
]; 
+0

感谢您的帮助,但我会坚持Scott发布的解决方案! – Philip 2012-03-03 14:17:22

1

可能this jsfiddle可以帮助你开始了吗?
here is an example派生自您的代码。

+0

@Kooilnc是的,该解决方案的作品,但我想我会用一个斯科特张贴。虽然谢谢! – Philip 2012-03-03 14:16:47

相关问题