JSON数组和Javascript

JSON数组和Javascript,javascript,json,Javascript,Json,我是json新手。我创建了与附加的json字符串结构相似的对象。我相信我故意创建的是一个嵌套数组对象 { "tracelog":{ "title":"", "phase":"12", "users":"", "logduration":"", "logdurationtype":"undefined", "showlogduedate":"no", "durationstartfield":"",

我是json新手。我创建了与附加的json字符串结构相似的对象。我相信我故意创建的是一个嵌套数组对象

  {
   "tracelog":{
      "title":"",
      "phase":"12",
      "users":"",
      "logduration":"",
      "logdurationtype":"undefined",
      "showlogduedate":"no",
      "durationstartfield":"",
      "fields":[
         {
            "atts":[
               {
                  "name":"dfvdfv",
                  "fieldtype":"text",
                  "followedbydate":"no",
                  "datetype":"---",
                  "fieldduration":"---",
                  "fielddurationtype":"undefined",
                  "fielddurationstart":"",
                  "autocalcunits":"none",
                  "validationtype":"none",
                  "fieldvisibleto":"",
                  "fieldaccessibleto":"",
                  "dropdown":""
               }
            ]
         },
         {
            "atts":[
               {
                  "name":"ffff",
                  "fieldtype":"text",
                  "followedbydate":"no",
                  "datetype":"---",
                  "fieldduration":"---",
                  "fielddurationtype":"undefined",
                  "fielddurationstart":"",
                  "autocalcunits":"none",
                  "validationtype":"none",
                  "fieldvisibleto":"",
                  "fieldaccessibleto":"",
                  "dropdown":""
               }
            ]
         }
      ]
   }
}
我要做的是找到名为“atts”的数组的长度。我对JSON字符串的解析如下

var obj = jQuery.parseJSON(jsonstring);
。。。然后把这些东西叫做

obj.tracelog.fields.length
准确地告诉我有多少字段

obj.tracelog.fields[0].atts.name
。。。为我提供名称,但抛出控制台错误,说明字段[0]未定义。所以它起作用了,但没有。而

obj.tracelog.fields[0].atts.length
不给我“atts”数组中的字段数(如果它实际上是一个数组-id像它一样),但给我“未定义”

有人能指出我哪里出了问题吗


谢谢。

obj.tracelog.fields[0]。atts
是一个数组,因此您必须像这样访问它:


obj.tracelog.fields[0].附件[0].名称

关于问题的后半部分:


obj.tracelog.fields[0]。atts.length
提供数组中的项数,在您的示例中,它是一个对象。看起来您实际上要做的是计算该数组中第一个对象的属性数(即,
obj.tracelog.fields[0].atts[0]
)。没有简单的
.length
样式属性可以为您提供对象上的属性数,但您可以循环使用它们并按如下方式计数:

var count = 0;
for (var test in obj.tracelog.fields[0].atts[0]) {
    count++;
}
 alert(count);

看起来您没有做错任何事情。查看您的对象结构,
obj.tracelog.fields[0]。atts
实际上是一个数组。所以这不可能起作用:
obj.tracelog.fields[0].atts.name
。它不会出错,但应该返回未定义的
,而不是名称。您可能需要使用:
obj.tracelog.fields[0]。atts[0]。name
您不需要jQuery来完成此操作。在符合ES5标准的主机中可用,对于那些不符合ES5标准的主机,有一个解决方案。atts是长度为1的数组,它包含作为对象的单个成员。也许您需要该对象上的属性计数?e、 g.
Object.keys(obj.tracelog.fields[0].atts[0]).length
在符合ES5标准的主机中。
Object.keys(您的_对象)。length
也是一个不错的单行程序,即使效率较低。谢谢Elliot。是的,这将返回名称,但是console仍然返回“TypeError:obj.tracelog.fields[0]未定义”-但下一行将根据您的建议返回名称。还有,“obj.tracelog.fields[0].atts.length返回“1”而不是“12”-它应该是12吗?哦,还是每个元素都应该在括号中?我将进行测试。我更新了我的答案,以详细说明可能是在您编写该注释的同时。
obj.tracelog.fields[0].atts.length
应该返回1,因为它是一个包含一个对象的数组。您要做的是计算我在上面的示例中提供的
obj.tracelog.fields[0]
对象上的属性数。@Jerska是的,这是一个非常好的单行程序,但在旧浏览器上不起作用。