【问题标题】:Parse a dynamic json objects from a json response从 json 响应中解析动态 json 对象
【发布时间】:2016-02-26 07:14:49
【问题描述】:

我有这个动态 json 对象

{
   "servers":[
      {
         "comp1":{
            "server1":{
               "status":"boxup",
               "ar":{
                  "0":"95.61"
               },
               "ip":{
                  "0":"192.168.1.0"
               }
            },
            "server2":{
               "status":"boxup",
               "ar":{
                  "0":"99.5"
               },
               "ip":{
                  "0":"192.168.0.1"
               }
            }
         }
      },
      {
         "comp2":{
            "server1":{
               "status":"boxup",
               "ar":{
                  "0":"88.39"
               },
               "ip":{
                  "0":"198.168.1.1"
               }
            },
            "server2":{
               "status":"boxup",
               "ar":{
                  "0":"99.88"
               },
               "ip":{
                  "0":"192.168.0.1"
               }
            }
         }
      },
      {
         "comp3":{
            "server1":{
               "status":"none",
               "ar":"none",
               "ip":"none"
            },
            "server2":{
               "status":"boxup",
               "ar":{
                  "0":"99.97"
               },
               "ip":{
                  "0":"http:\/\/122.01.125.107"
               }
            }
         }
      },
      {
         "comp4":{
            "server1":{
               "status":"boxup",
               "ar":{
                  "0":"95.64"
               },
               "ip":{
                  "0":"192.168.1.0"
               }
            },
            "server2":{
               "status":"boxup",
               "ar":{
                  "0":"95.65"
               },
               "ip":{
                  "0":"192.168.1.2"
               }
            }
         }
      },
      {
         "comp5":{
            "server1":{
               "status":"boxup",
               "ar":{
                  "0":"71.92"
               },
               "ip":{
                  "0":"192.168.1.0"
               }
            },
            "server2":{
               "status":"boxup",
               "ar":{
                  "0":"98.89"
               },
               "ip":{
                  "0":"192.168.0.3"
               }
            }
         }
      }
   ]
}

我尝试用 $.each 解析它(请参阅下文)

$.ajax({
        url:"/server-monitoring/load-servers",
        type:'post',
        dataType:'json',
        success:function(e){
            if(e.success){
                $.each(e.servers,function(index,value){
                    //log the status from server1 on every comp
                    console.log(value.server1.status);
                });
            }
        }
    });

但不幸的是,它返回给我一个错误(请参阅下文)

未捕获的类型错误:无法读取未定义的属性“状态”

有什么帮助、想法、建议、推荐、线索吗?

【问题讨论】:

  • 您正在尝试循环一个 json。 json 是一个字符串。您需要将其解析为一个对象,然后循环它
  • 你为什么要e.success?您是否正在尝试检查 ajax 调用是否成功?还是来自服务器的消息成功了?
  • 因为数组中的每个对象都有一个名为comp[num] 的主键,它是一个对象,其中是包含状态属性的服务器对象。
  • @Reddy,如果 dataType 设置正确,jQuery 会自动解析 JSON。无需再次解析。
  • @Andy 。感谢您的信息,

标签: javascript jquery json ajax parsing


【解决方案1】:

根据您的响应结构,以下将起作用

$.each(e.servers,function(index,value){
                    //log the status from server1 on every comp
                    console.log(value['comp'+(index+1)].server1.status);
                });

输出为

boxup
boxup
none
boxup
boxup

编辑:

在评论中澄清并假设会有任何单个键 下面可以工作

$.each(e.servers,function(index,value){
                    //log the status from server1 on every comp
                    var key = Object.keys(value)[0];
                    console.log(value[key].server1.status);
                }); 

【讨论】:

  • 很好@Andy +1,Reddy 在那个方向上的评论..酷!!
  • 实际上有一种情况不是comp1,comp2等。所以我不能像console.log(value['comp'+(index+1)].server1.status);因为comp是动态的,例如它可以是“adelle”而不是comp
  • 会有单键吗?
  • 啊哈哈这就是我想知道的..我认为它的倍数..他的 server1 也可以是倍数。
  • 伙计们,唯一的动态是他们的关键对象,例如comp1、comp2 等,其余部分在 json 响应中是静态的。
【解决方案2】:

这段代码怎么样。它还将处理动态键、对象数量和动态内部对象。

$.each(data.servers, function(key, value) {
   $.each(this,function(key,value){
       var parentObj = key;      
       $.each(value,function(key,value){
          console.log(parentObj + '------'+key + '-----'+value.status);       
       });
   });
});

这是Working Fiddle

这是输出。

comp1------server1-----boxup
comp1------server2-----boxup
comp2------server1-----boxup
comp2------server2-----boxup
comp3------server1-----none
comp3------server2-----boxup
comp4------server1-----boxup
comp4------server2-----boxup
comp5------server1-----boxup
comp5------server2-----boxup

【讨论】:

    【解决方案3】:

    通过观察您的 JSON 结构,我相信每个服务器对象(在服务器数组中)都有一个属性,例如 comp1、comp2 ...这是未知的。

    以下代码有效。

       var comp = {}; //Just a temp variable to hold dynamic comp property
                      // value
    
       $.each(v.servers,function(i,v){ 
          //Loop through each key in server object to find first property.
          for(var key in v) {
            //Make sure its objects own property, just to be safe.
            if(v.hasOwnProperty(key)) {
                // Fetch our comp (assumed, you can also match key 
                // and make sure it starts with comp ...
                comp = v[key];
                break;
            }
          }
          //As we have our comp object, now we can access server1, server2 as shown below
          console.log(comp.server1.status);
        });
    

    希望这会有所帮助!如果您需要进一步的帮助,请告诉我.... :)

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多