Javascript 试图在json中转义null属性,但仍然得到;TypeError:json.output“状态未定义”;

Javascript 试图在json中转义null属性,但仍然得到;TypeError:json.output“状态未定义”;,javascript,json,Javascript,Json,首先,很抱歉问了这个非常常见的问题,但我无法修复这个错误。我有一些空值的属性。属性为json[i].output\u status.category,目标是统计json结构中每个类别的出现次数,而不使用category的null属性。我试图通过以下方式逃避: if(json[i].outcome_status.category != null) 但是,我仍然得到一个错误,即属性为null。这是我的密码: <!--Load the AJAX API--> <script typ

首先,很抱歉问了这个非常常见的问题,但我无法修复这个错误。我有一些空值的属性。属性为
json[i].output\u status.category
,目标是统计json结构中每个类别的出现次数,而不使用category的null属性。我试图通过以下方式逃避:

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>

//加载可视化API和piechart包。
load('visualization','1',{'packages':['table']});
//将回调设置为在加载Google Visualization API时运行。
setOnLoadCallback(drawChart);
函数绘图图(){
var jsonData=$.ajax({
url:“getData.php”,
数据类型:“json”,
异步:false
}).responseText;
var dataTable=new google.visualization.dataTable();
addColumn('string','category');
addColumn('string','context');
addColumn('number','id');
addColumn('string','location_subtype');
addColumn('string','location_type');
addColumn('string','month');
addColumn('string','persistent_id');
addColumn('string','street name');
addColumn('string','output status');
json=json.parse(jsonData);
var计数器=0;
var countAntiSocial=0;
var Count盗窃=0;
var=0;
var=0;
var countOtherTheft=0;
var=0;
var=0;
var countshoppling=0;
var countVehicleCrime=0;
var countViolentCrime=0;
var countOtherCrime=0;
对于(var i=0;iTry

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

not not子句非常方便

编辑:


row.push((!!json[i].output_status&&!!json[i].output_status.category)?json[i].output_status.category:“null”);
问题在于
json[i].output_status
未定义,则您正在尝试访问该属性。没有任何
类别
属性具有值,因为您希望该属性存在的对象本身不存在

你可以在这里处理:

row.push(json[i].outcome_status ? json[i].outcome_status.category : "null");
由于该代码本质上是:If
json[i]。output\u status
未定义,请返回其类别,否则返回字符串
“null”

但是,您不能在下面两行处理它:

if(json[i].outcome_status.category != null) {
这应该是:

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

本质上,如果它有一个结果状态,并且有一个真实值的属性类别,那么就在里面编写代码。

谢谢你的回答,但我仍然得到了错误匹配。我不知道这是否是因为数据的格式。是的,你可能想尝试在上面添加几行:row.push(!!json[I].output_status&!!json[i]。output_status.category)?json[i]。output_status.category:“null”);你的意思是代替
row.push(json[i]。output_status?json[i]。output_status.category:“null”);
放置
row.push(!!json[i]。output_status.category)?json[i]。output_status.category:“null”)
?是的,但是既然
结果_状态
定义在json url中,并且它还有一个属性
类别
,那么为什么我不能通过
json[I]访问它呢.output\u status.category
?我尝试了最后一行代码,但仍然得到
TypeError:json.output\u status未定义
@AndreUk13您无法使用
json[I]访问它。output\u status.category
,因为
json[I].output\u status
未定义。对于该数组中的至少一个对象,没有
output\u status
属性。现在已修复!顺便问一下,您知道一种更有效的方法来计算
output\u status.category
中的出现次数吗?如您所见,我有8条if语句来计算每个类别。还有其他方法吗高效的方法?再次感谢。@AndreUk13您可以使用一个空对象:
var counts={}
,然后使用
json[i].output\u status.category
的值作为设置计数的键。类似这样:
if(json[i].outcome_status != null && json[i].outcome_status.category != null)