使用带有PHP的JSON提要

时间:2013-07-22 12:52:51

标签: php json

我在使用带有php的json feed时遇到问题。 例如:

[{"type":"article",
"article":[{
"title":"hello",
"number":{
"facebook":4,
"twitter":6}
}],

[{"type":"article",
"article":[{
"title":"hello",
"number":{
"facebook":1,
"twitter":3}
}],

保存标题没问题:

$titre = $data[$i]['type'][0]['title'];

但我找不到如何保存Facebook号码。 我尝试了很多组合

$number = $data[0]['type'][$i]['scores']['facebook'][0];

OR

$number = $data[0]['type'][$i]['scores']['facebook'];

OR

$number = $data[0]['type'][$i]['scores']['facebook'][1];

没有人工作......你有什么想法吗? 非常感谢你们!

3 个答案:

答案 0 :(得分:2)

您的json无效。

http://php.net/manual/en/function.json-last-error.php

$json = '[{"type":"article",
  "article":[{
  "title":"hello",
  "number":{
  "facebook":4,
  "twitter":6}
  }],

  [{"type":"article",
  "article":[{
  "title":"hello",
  "number":{
  "facebook":1,
  "twitter":3}
  }]';
$array = json_decode($json, true);

switch (json_last_error()) {
  case JSON_ERROR_NONE:
    echo ' - No errors';
    break;
  case JSON_ERROR_DEPTH:
    echo ' - Maximum stack depth exceeded';
    break;
  case JSON_ERROR_STATE_MISMATCH:
    echo ' - Underflow or the modes mismatch';
    break;
  case JSON_ERROR_CTRL_CHAR:
    echo ' - Unexpected control character found';
    break;
  case JSON_ERROR_SYNTAX:
    echo ' - Syntax error, malformed JSON';
    break;
  case JSON_ERROR_UTF8:
    echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
    break;
  default:
    echo ' - Unknown error';
    break;
}

print_r($array);
  • 语法错误,格式错误的JSON

答案 1 :(得分:0)

尝试使用json_decode()函数(php manual entry)。通过这种方式,您可以轻松访问json的值,并避免在尝试查找数组上的值时出现问题。

如果你的Json无效或有问题(这有助于调试),这也将返回NULL

答案 2 :(得分:0)

正如其他人所说,你提供的json无效。

查看其结构似乎意图是拥有一个对象数组,每个对象都有一个“类型”键和一个嵌入对象,其键名根据类型键的值而变化。 (各种类型的键(在给出键的两个例子中都是“文章”)拥有一个标题,以及一个持有twitter和facebook的对象。)

两个注释:

  1. 从破碎的json我们不确定是否嵌入了文章 object是一个对象或一个对象数组,所以我们将显示 两种情况的方法。
  2. 可能是嵌入式的关键名称     对象是可变的,因此我们每次都需要从中推导出它     类型值(但在我们的示例中,它始终是'article'
  3. 现在要访问该结构,当您知道该类型是文章时,以下内容是有效的(我们假设$ data包含已解码的json):

    $data[$i]['article']['title']
    
    $data[$i]['article']['number']['facebook']
    

    如果嵌入为对象数组,则应该是(访问第一个对象):

    $data[$i]['article'][0]['title']
    
    $data[$i]['article'][0]['number']['facebook']
    

    但是我们可能需要推断出密钥名称,因为它似乎是可变的,所以一般的正确形式是:

    $typeName = $data[$i]['type']
    $data[$i][$typeName]['title']
    $data[$i][$typeName]['number']['facebook']
    

    在Facebook的扩展形式中是:$data[$i][$data[$i]['type']]['number']['facebook']

    如果案例是“文章”嵌入为对象数组,那么:

    $typeName = $data[$i]
    $data[$i][$typeName][0]['title']
    $data[$i][$typeName][0]['number']['facebook']
    

    在Facebook的扩展形式中是:$data[$i][$data[$i]['type']][0]['number']['facebook']

    这是一个针对这两个json结构运行的脚本,并访问它们的数据:

    <?php
    //Two possible jsons, it seems that:
    //1)the embedded article object can be an object or an array of objects so we try two different json structures
    //2)also it seems that the key of the embedded object is variable and thus we need to take it every time from the type value (however in our examples it is always 'article'
    $json1 = '[{"type":"article", "article":{"title":"hello","number":{"facebook":4,"twitter":6}}},{"type":"article","article":{"title":"hello","number":{"facebook":1,"twitter":3}}}]';
    $json2 = '[{"type":"article", "article":[{"title":"hello","number":{"facebook":4,"twitter":6}}]},{"type":"article","article":[{"title":"hello","number":{"facebook":1,"twitter":3}}]}]';
    $data1 = json_decode($json1, true);
    $data2 = json_decode($json2, true);
    
    for ($i=0; $i<count($data1); $i++) {
        $articleType = $data1[$i]['type'];
        echo 'Title from element: ',$i, ' ', $data1[$i][$articleType]['title'],
        PHP_EOL;
        echo 'Facebook number from element ', $i, ' ',
        $data1[$i][$articleType]['number']['facebook'], PHP_EOL;
        echo 'Twitter number from element ', $i, ' ',
        $data1[$i][$articleType]['number']['twitter'], PHP_EOL;
    }
    
    //However if we have embedded an array of objects then we access this way (hardcoded to index 0)
    $embIndex = 0;
    for ($i=0; $i<count($data2); $i++) {
        $articleType = $data2[$i]['type'];
        echo 'Title from element ',$i, ' and embedded object index ',
        $embIndex, ': ',$data2[$i][$articleType][$embIndex]['title'], PHP_EOL;
        echo 'Facebook number from element ', $i, ' and embedded object index ',
        $embIndex, ': ', $data2[$i][$articleType][$embIndex]['number']['facebook'], PHP_EOL;
        echo 'Twitter number from element ', $i, ' and embedded object index ',
        $embIndex, ': ', $data2[$i][$articleType][$embIndex]['number']['twitter'], PHP_EOL;
    }
    

    和输出:

    Title from element: 0 hello
    Facebook number from element 0 4
    Twitter number from element 0 6
    Title from element: 1 hello
    Facebook number from element 1 1
    Twitter number from element 1 3
    Title from element 0 and embedded object index 0: hello
    Facebook number from element 0 and embedded object index 0: 4
    Twitter number from element 0 and embedded object index 0: 6
    Title from element 1 and embedded object index 0: hello
    Facebook number from element 1 and embedded object index 0: 1
    Twitter number from element 1 and embedded object index 0: 3