苦苦挣扎来解释PHP中的JSON数据

时间:2011-11-13 13:53:07

标签: javascript json

我正在尝试使用从php脚本收到的数据,这是json_encode'd,但我似乎无法正确使用。

这是我正在使用的javascript函数 JS:

function dispJSON(items) {
  console.log('Raw from PHP:' + items);
  var strJSON = JSON.stringify(items);
  console.log('Sent from PHP and stringified:' + strJSON);
  $('#results').append(strJSON + '<hr>');
  var opStr =  '';
  for (i=0; i<items.length; i++){    //Get each Record
    console.log('REC=' + items[i].tostring);
    for (var key in items[i]) {
      console.log(key + ' => ' + items[i][key]);
    }
  }
}

这就是控制台所说的。 控制台:

WCIT.html:60  Sent from PHP and stringified:[[{"vehGrpName":"Austin","vehTitle":"Austin A30 (AS3 and AS4)","vehDescrip":"The new look Baby Austin to rival the Morris Minor."}],[{"vehGrpName":"Austin","vehTitle":"Austin A35","vehDescrip":"An improved A30.  Better brakes, gearbox and engine."}]]
WCIT.html:64  REC=undefined
WCIT.html:66  0 => [object Object]
WCIT.html:64  REC=undefined
WCIT.html:66  0 => [object Object]

所以我显然误解了一些基础知识。我的javascript / json知识非常有限。

我似乎得到一个数组(所有记录),由两个数组组成(即每个记录,其中包含记录的json对象)

我的代码显然很垃圾,所以如果有人能说得对,我会非常感激。

由于

1 个答案:

答案 0 :(得分:1)

在你的dispJSON函数中,你根本不再处理JSON(这是一种文本数据表示法) - 某些地方的某些东西已经为你反序列化了(这很方便)。你正在处理结果数组。从字符串化副本的外观来看,它是一个数组数组,子数组中的每个条目(奇怪的是每个只有一个条目)是一个具有各种属性的对象:

[
    [
        {
            "vehGrpName": "Austin",
            "vehTitle": "Austin A30 (AS3 and AS4)",
            "vehDescrip": "The new look Baby Austin to rival the Morris Minor."
        }
    ],
    [
        {
            "vehGrpName": "Austin",
            "vehTitle": "Austin A35",
            "vehDescrip": "An improved A30.  Better brakes, gearbox and engine."
        }
    ]
]

jsonlint对漂亮的印刷结构非常方便。)

所以你需要遍历它并处理每个子数组及其条目(live copy):

function dispStuff(items) {
    var outer, inner, sub, entry;

    for (outer = 0; outer < items.length; ++outer) {
        sub = items[outer];
        for (inner = 0; inner < sub.length; ++inner) {
            entry = sub[inner];
            console.log("Entry " + outer + "," + inner + ":");
            console.log("vehGrpName = " + entry.vehGrpName);
            console.log("vehTitle = " + entry.vehTitle);
            console.log("vehDescrip = " + entry.vehDescrip);
        }
    }
}

或者,如果您不想在代码中使用输入键(live copy):

function dispStuff(items) {
    var outer, inner, sub, entry, name;

    for (outer = 0; outer < items.length; ++outer) {
        sub = items[outer];
        for (inner = 0; inner < sub.length; ++inner) {
            entry = sub[inner];
            console.log("Entry " + outer + "," + inner + ":");
            for (name in entry) {
              console.log(name + " = " + entry[name]);
            }
        }
    }
}

这是有效的,因为for..in遍历对象中属性的名称(以及其任何原型对象的属性名称),并且因为您可以通过两种不同的方式引用对象属性:在熟悉的obj.propName表单中propName是文字,或obj["propName"]表单,其中属性名称是字符串。当然,因为它是一个字符串,它可以是任何表达式的结果。


另外:您可能想知道为什么您的PHP代码正在创建每个都有一个条目的子数组......