【问题标题】:Why JSON conversion returns Array?为什么 JSON 转换返回 Array?
【发布时间】:2019-02-02 12:30:57
【问题描述】:

当我想检查新转换的类型时,我不知道为什么使用 JSON.parse function 格式化为 json 的数据返回为 Array type

首先我发出 ajax 请求从数据库中获取数据,如下图所示

$.ajax({
   url:'processBet.php',
   data:'',
   success:function(data){  
    //below I check the return data type
      console.log( Object.getPrototypeOf(JSON.parse(data)));
    //the return type is array.....why?
     console.log((JSON.parse(data)); // to see the data

   }
});

显然,在数据库中获取数据的文件会将数据放入数组中。所以在发送之前,我使用一个php函数json_encode将其转换为JSON,如下图所示

$ql = "SELECT * from   tempdata" ;
    $result=$pdo->query($ql);
    $result->setFetchMode(PDO::FETCH_ASSOC);
    while($data = $result->fetch()){
        $arrays[]=$data;
    }
//Now I convert in json before sending
 $json =json_encode($arrays);
 echo $json;  // the return data supposed to be json type

下面是ajax请求成功后返回的数据示例

所以我想知道为什么返回类型仍然是数组而不是 JSON,因为当 ajax 请求成功时已经进行了新的转换

【问题讨论】:

  • 因为你把它通过JSON.parse,它把它变成了你json_encode之前的数组。你应该试试console.log( Object.getPrototypeOf(data));,它会给你String
  • 是的,我这样做是为了获取返回数据的类型。我的问题是:它是否正确,因为我必须确定这一点,以免出现错误。谢谢
  • 数组不是类型,JSON 也不是。 Object.getPrototypeOf 有效地返回在[[Prototype]] 链上找到的第一个原型的构造函数的名称。

标签: javascript php ajax


【解决方案1】:

原因是您在编码之前如何设置数组。

$arrays[] = $data;

如果元素的深度超出数组的范围,PHP 会将其设置为对象。


示例:

如果你创建一个像这样的简单二维数组:

$p = [
    'name' => 'jack',
    'job' => 'ceo',
    'age' => 'old'
]; // {"name":"jack","job":"ceo","age":"old"}

你的 JS 代码中会有一个对象;那是因为 PHP 处理它的方式。但是,请将此示例视为替代方法:这将返回一个对象数组:

$p = [[
    'name' => 'jack',
    'job' => 'ceo',
    'age' => 'old'
],[
    'name' => 'sam',
    'job' => 'cool',
    'age' => 'decent'
]];

echo json_encode($p); //[{"name":"jack","job":"ceo","age":"old"},{"name":"sam","job":"cool","age":"decent"}]

这就是关键的位置。如果你有一个key => pair 数组,无论如何它都会变成一个对象。再看一个简单 JS 数组的例子:

print_r(json_encode([
    'burger',
    'pizza'
])); // ["burger","pizza"]

但是如果你只添加一个key=>pair 到你的数组中,它将变成一个 json 对象:

print_r(json_encode([
    'burger',
    'pizza',
    'people' => [
        'jack' ,
        'sam',
        'pete'
    ]
])); // {"0":"burger","1":"pizza","people":["jack","sam","pete"]}

仅出于教育目的,如果您将其放入另一个 1d 数组中,您将获得一个数组对象:

print_r(json_encode([[
    'burger',
    'pizza',
    'people' => [
        'jack' ,
        'sam',
        'pete'
    ]
]])); // [{"0":"burger","1":"pizza","people":["jack","sam","pete"]}]

解释:

在处理数组时,它会严格处理从0到数组中有多少项的key;所以arrayjson_encode 术语中是任何具有简单一维界面的东西:

在 PHP 和 JavaScript 中应该是这样的:

PHP

print_r([
  'burger',
  'pizza'
]); // Array ( [0] => burger [1] => pizza ) 

Javascript

console.log([
  'burger',
  'pizza'
]); // Array [ "burger", "pizza" ]

当将key 添加到您的数组并使其成为二维或更复杂的json_encode 时,会将其转换为JavaScript 对象;正如我们在第一个示例中看到的那样:

【讨论】:

  • 感谢您的解释 从今天开始我知道数组的键在转换过程中起着很大的作用
  • @GNETODOMINIQUE 是的,伙计;除此之外,json_encode 文档并不擅长解释差异。这只是我在编写 PHP 期间所做的一个观察
  • 别担心,我知道这可能不是官方的解释,但它有很大帮助。你做了一个很好的结论
猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多