2014-01-28 4 views
0

먼저이 매우 일반적인 질문을 드려서 죄송 합니다만이 오류를 해결할 수 없습니다. null 값을 가진 일부 속성이 있습니다. 이 속성은 json[i].outcome_status.category이며 목표는 범주의 null 속성없이 json 구조에서 각 범주의 발생 횟수를 계산하는 것입니다. 나는 그것을 피하려고 노력하고있다 :json의 null 속성에서 벗어나려고해도 "TypeError : json.outcome_status is undefined"가 표시됩니다.

if(json[i].outcome_status.category != null) 

그러나 나는 여전히 그 속성이 null이라는 오류를 얻고있다.

<!--Load the AJAX API--> 
<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script type="text/javascript"> 

// Load the Visualization API and the piechart package. 
google.load('visualization', '1', {'packages':['table']}); 

// Set a callback to run when the Google Visualization API is loaded. 
google.setOnLoadCallback(drawChart); 

function drawChart() { 
    var jsonData = $.ajax({ 
     url: "getData.php", 
     dataType:"json", 
     async: false 
     }).responseText; 
    var dataTable = new google.visualization.DataTable(); 
     dataTable.addColumn('string','category'); 
     dataTable.addColumn('string','context'); 
     dataTable.addColumn('number','id'); 
     dataTable.addColumn('string','location_subtype'); 
     dataTable.addColumn('string','location_type'); 
     dataTable.addColumn('string','month'); 
     dataTable.addColumn('string','persistent_id'); 
     dataTable.addColumn('string','street name'); 
     dataTable.addColumn('string','outcome status'); 

     json=JSON.parse(jsonData); 
     var counter = 0; 
     var countAntiSocial = 0; 
     var countBurglary = 0; 
     var countCriminal = 0; 
     var countDrugs = 0; 
     var countOtherTheft = 0; 
     var countPublicDisorder = 0; 
     var countRobbery = 0; 
     var countShoplifting = 0; 
     var countVehicleCrime = 0; 
     var countViolentCrime = 0; 
     var countOtherCrime = 0; 
    for (var i=0; i<json.length; i++) { 
     var row = [];  
     row.push(json[i].category); 
     row.push(json[i].context); 
     row.push(json[i].id); 
     row.push(json[i].location_subtype); 
     row.push(json[i].location_type); 
     row.push(json[i].month); 
     row.push(json[i].persistent_id); 
     row.push(json[i].location.street.name); 
     row.push(json[i].outcome_status ? json[i].outcome_status.category : "null"); 
     dataTable.addRow(row); 
        //escaping the nulls 
     if(json[i].outcome_status.category != null) { 
      if(json.outcome_status.category == "anti-social-behavior"){ 
       countAntiSocial = countAntisocial + 1; 
      } 

      if(json[i].outcome_status.category == "burglary"){ 
       countBurglary = countBurglary + 1 
      } 

      if(json[i].outcome_status.category == "criminal-damage-arson"){ 
       countCriminal = countCriminal + 1; 
      } 

      if(json[i].outcome_status.category == "drugs"){ 
       countDrugs = countDrugs + 1; 
      } 

      if(json[i].outcome_status.category == "other-theft"){ 
       countOtherTheft = countOtherTheft + 1; 
      } 

      if(json[i].outcome_status.category == "public-disorder-weapons"){ 
       countPublicDisorder = countPublicDisorder + 1; 
      } 

      if(json[i].outcome_status.category == "robbery"){ 
       countRobbery = countRobbery + 1; 
      } 

      if(json[i].outcome_status.category == "shoplifting"){ 
       countShopLifting = countShopLifting + 1; 
      } 

      if(json[i].outcome_status.category == "vehicle-crime"){ 
       countVehicleCrime = countVehicleCrime + 1; 
      } 

      if(json[i].outcome_status.category == "violent-crime"){ 
       countViolentCrime = countViolentCrime + 1; 
      } 

      if(json[i].outcome_status.category == "other-crime"){ 
       countOtherCrime = countOtherCrime + 1; 
       alert(countOtherCrime); 
      } 
     } 
    } 
     var chart = new google.visualization.Table(document.getElementById('chart_div')); 
     chart.draw(dataTable, {width: 1000, height: 300}); 

}   
</script> 

내 PHP : 누군가가 실수 무엇을 발견 할 수 있다면, 그

<?php 
$json = file_get_contents('http://data.police.uk/api/crimes-street/all-crime?lat=52.629729&lng=-1.131592&date=2013-01'); 
$json = str_replace("\xe2\x80\xa8", '\\u2028', $json); 
$json = str_replace("\xe2\x80\xa9", '\\u2029', $json); 
echo $json; 
?> 

을 감상 할 수있다 여기에 내 코드입니다. 건배

답변

1

문제는 json[i].outcome_status가 정의되지 않은 점이다는, 당신은 그 속성에 액세스를 시도하고 있습니다. 값이있는 속성은 category이며, 속성이 존재할 것으로 기대하는 개체가 자체적으로 존재하지 않으므로 값을 가질 속성이 없습니다.

당신은 처리 여기에 :

row.push(json[i].outcome_status ? json[i].outcome_status.category : "null"); 

그 코드는 본질적으로 이후 : json[i].outcome_status이 정의되지 않으면, 그렇지 않으면 문자열 "null"을 반환, 그 범주를 반환합니다. 그것이 결과 상태가있는 경우, 기본적으로

if(json[i].outcome_status != null && json[i].outcome_status.category != null) 

을하고 그건 속성 범주가 있습니다 :

if(json[i].outcome_status.category != null) { 

가되어야한다 :

그러나, 당신은 아래로 여기 두 줄을 처리하지 않는 진실한 가치, 코드를 내부에서하십시오.

+0

그래,하지만'outcome_status'가 json url에 정의되어 있고'category' 속성을 가지고 있기 때문에 왜'json [i] .outcome_status.category'를 통해 액세스 할 수 없습니까? 나는 마지막 줄의 코드를 시도했지만 여전히'TypeError : json.outcome_status is undefined'를 얻는다. –

+0

@ AndreUk13'json [i] .outcome_status' **가 정의되지 않았기 때문에'json [i] .outcome_status.category'를 사용하여 액세스 할 수 없습니다. 해당 배열 **에있는 객체 중 적어도 하나에는'outcome_status' 속성 **이 없습니다. –

+0

지금 해결!Btw,'outcome_status.category'에서 발생 횟수를 세는보다 효율적인 방법을 알고 있습니까? 당신이 볼 수 있듯이 나는 각 카테고리를 세는 if 문이 8 개 있습니다. 더 효율적인 방법이 있습니까? 다시 한번 감사드립니다. –

0

if(!!json[i].outcome_status.category) {

하지-하지 절은 매우 편리보십시오!

편집 :

row.push((!!json[i].outcome_status && !!json[i].outcome_status.category) ? json[i].outcome_status.category : "null");

+0

답변을 주셔서 감사합니다.하지만 오류 메이트가 계속 표시됩니다. 데이터의 형식 때문인지 모르겠다. –

+0

아, 네가 위의 두 줄을 추가하려고 할 수 있습니다. row.push ((!! !! json [i] .outcome_status && !! json [i ] .outcome_status.category)? json [i] .outcome_status.category : "null"); – Alex

+0

당신은'row.push (json [i] .outcome_status? json [i] .outcome_status.category : "null") 대신'row.push (''json [i] .outcome_status &&! ! json [i] .outcome_status.category)? json [i] .outcome_status.category : "null");'? –

관련 문제