Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP解析JSON_Php_Arrays_Json - Fatal编程技术网

用PHP解析JSON

用PHP解析JSON,php,arrays,json,Php,Arrays,Json,我正试图从谷歌的购物API中提取数据。我能够成功地下载数据,但是我在用PHP解析数据时遇到了困难。我还在学习,但我似乎对多维数组有问题。我用$JSON=JSON\u decode($data)捕获JSON 以下内容仅与外部阵列相呼应,但我无法从内部阵列中提取: foreach($json as $key => $value) { echo $key . " : " . $value; } 如果我想抓住每个产品的“标题”、“描述”、“品牌”和“可用性”,我将如何解析它 { "kind

我正试图从谷歌的购物API中提取数据。我能够成功地下载数据,但是我在用PHP解析数据时遇到了困难。我还在学习,但我似乎对多维数组有问题。我用
$JSON=JSON\u decode($data)捕获JSON

以下内容仅与外部阵列相呼应,但我无法从内部阵列中提取:

foreach($json as $key => $value) {
  echo $key . " : " . $value;
}
如果我想抓住每个产品的“标题”、“描述”、“品牌”和“可用性”,我将如何解析它

{
 "kind": "shopping#products",
 "etag": "\"T9uPnY2MZMB71TDpKXXZdr3yWX4/qtJ5vmpftFWNfijyLD9ti2Xpj-w\"",
 "id": "tag:google.com,2010:shopping/products",
 "selfLink": "https://www.googleapis.com/shopping/search/v1/public/products?country\u003dus&q\u003dsony&maxResults\u003d3&startIndex\u003d2",
 "nextLink": "https://www.googleapis.com/shopping/search/v1/public/products?country\u003dus&q\u003dsony&maxResults\u003d3&startIndex\u003d5",
 "previousLink": "https://www.googleapis.com/shopping/search/v1/public/products?country\u003dus&q\u003dsony&maxResults\u003d3&startIndex\u003d1",
 "totalItems": 633694,
 "startIndex": 2,
 "itemsPerPage": 3,
 "currentItemCount": 3,
 "items": [
  {
   "kind": "shopping#product",
   "id": "tag:google.com,2010:shopping/products/1161353/11882813508247586172",
   "selfLink": "https://www.googleapis.com/shopping/search/v1/public/products/1161353/gid/11882813508247586172",
   "product": {
    "googleId": "11882813508247586172",
    "author": {
     "name": "Buy.com",
     "accountId": "1161353"
    },
    "creationTime": "2011-04-24T05:13:38.000Z",
    "modificationTime": "2011-08-05T17:45:24.000Z",
    "country": "US",
    "language": "en",
    "title": "Sony BRAVIA KDL-46EX720 46 inch 3D LED HDTV 1080p 120Hz",
    "description": "Entertainment lovers the slim Sony EX720-Series LED HDTV is for you. See precise motion detail plus watch your favorite 2D or 3D entertainment in clear, vivid Full HD 1080p picture quality with incredible contrast. You can even connect to the internet and access a great selection of online entertainment with Netflix , Hulu Plus , Pandora , Qriocity and more - there s always something on. Plus video chat with friends and family when you Skype on the big screen.",
    "link": "http://clickfrom.buy.com/default.asp?adid\u003d17902&sURL\u003dhttp%3A%2F%2Fwww.buy.com%2Fprod%2Fsony-bravia-kdl-46ex720-46-3d-led-hdtv-1080p-120hz%2Fq%2Fsellerid%2F10004001%2Floc%2F111%2F219891693.html",
    "brand": "Sony",
    "condition": "new",
    "gtin": "00027242817081",
    "gtins": [
     "00027242817081"
    ],
    "inventories": [
     {
      "channel": "online",
      "availability": "inStock",
      "price": 1348.0,
      "currency": "USD"
     }
    ],
    "images": [
     {
      "link": "http://ak.buy.com/PI/0/1000/219891693.jpg"
     }
    ]
   }
  },
  {
   "kind": "shopping#product",
   "id": "tag:google.com,2010:shopping/products/7827/1976288072671326122",
   "selfLink": "https://www.googleapis.com/shopping/search/v1/public/products/7827/gid/1976288072671326122",
   "product": {
    "googleId": "1976288072671326122",
    "author": {
     "name": "Dell",
     "accountId": "7827"
    },
    "creationTime": "2011-06-08T15:11:49.000Z",
    "modificationTime": "2011-08-05T15:04:13.000Z",
    "country": "US",
    "language": "en",
    "title": "Sony Bravia 55\" KDL55EX500 1080p 120Hz LCD HDTV",
    "description": "Enjoy breathtaking viewing experience with Bravia 55-inch KDL55EX500 1080p LCD HDTV from Sony®. This LCD TV features Motionflow™ 120 Hz Technology that allows you to experience smooth motion detail and clarity which delivers a crisp, fluid and realistic viewing skill during fast-action scenes. Additionally, the incorporated LightSensor™ Technology automatically increases or decreases the level of brightness of your TV's backlight based on a room's lighting conditions. Moreover, the BRAVIA Engine™ 2 fully processor lets you enjoy sharp, vibrant, life-like images while optimizing color, contrast and significantly reducing noise. Besides this, get a natural looking picture with an Ambient Sensor. Plus, you can also share your photos and music on the big screen by simply connecting your digital camera, USB-enabled MP3 player, or USB storage device directly to your HDTV's USB input. With all these features loaded into a single television the Bravia EX500 is an ideal choice to complement your digital lifestyle.var wcCpi\u003d\"A3477150\";",
    "link": "http://lt.dell.com/lt/lt.aspx?CID\u003d27530&LID\u003d627063&DGC\u003dSS&DGSeg\u003dDHS&DURL\u003dhttp://accessories.us.dell.com/sna/productdetail.aspx?c\u003dus%26l\u003den%26s\u003ddhs%26cs\u003d19%26sku\u003dA3477150%26CAWELAID\u003d469727188",
    "brand": "Sony",
    "condition": "new",
    "gtin": "00027242784932",
    "gtins": [
     "00027242784932"
    ],
    "inventories": [
     {
      "channel": "online",
      "availability": "inStock",
      "price": 1348.0,
      "currency": "USD"
     }
    ],
    "images": [
     {
      "link": "http://accessories.us.dell.com/sna/images/products/large/A3477150temp.jpg"
     }
    ]
   }
  },
  {
   "kind": "shopping#product",
   "id": "tag:google.com,2010:shopping/products/1113342/9429326904502109794",
   "selfLink": "https://www.googleapis.com/shopping/search/v1/public/products/1113342/gid/9429326904502109794",
   "product": {
    "googleId": "9429326904502109794",
    "author": {
     "name": "Walmart",
     "accountId": "1113342"
    },
    "creationTime": "2011-03-26T23:58:51.000Z",
    "modificationTime": "2011-08-04T19:42:49.000Z",
    "country": "US",
    "language": "en",
    "title": "Sony Bravia 32\" Class 3D LED-LCD 1080p 240Hz HDTV,1.68\" ultra-Slim,",
    "description": "Note: You must have a source of HD programming in order to take full advantage of the Sony Bravia 32\" Class 3D 1080p LED HDTV. Contact your local cable or satellite TV provider for details on how to upgrade.Visit the Sony Brand Shop for 3D glasses, other 3D HDTVs and more.Sony Bravia 32\" Class 3D 1080p LED HDTV 240Hz, KDL-32EX720:See It All In 3D: Engineered with advanced technologies, the EX720 Series is more than a fully-loaded HDTV with 3D. Once you slide on the active shutter glasses (sold separately), the on-screen image is precisely synchronized and delivered with the Full HD image intact for an immersive entertainment viewing experience with maximum resolution and superb clarity.Slim Design, Stunning Picture: Experience the next level of picture quality and contrast with Edge LED Backlight technology. U",
    "link": "http://www.walmart.com/ip/Sony-KDL-32EX720/15780230?sourceid\u003d1500000000000003142050&ci_src\u003d14110944&ci_sku\u003d15780230",
    "brand": "Sony",
    "condition": "new",
    "gtin": "00027242817135",
    "gtins": [
     "00027242817135"
    ],
    "inventories": [
     {
      "channel": "online",
      "availability": "inStock",
      "price": 898.0,
      "currency": "USD"
     }
    ],
    "images": [
     {
      "link": "http://i.walmartimages.com/i/p/00/02/72/42/81/0002724281713_500X500.jpg"
     }
    ]
   }
  }
 ]
}

这不是一个JSON问题。您只需要遍历数组。一个简单的示例将向您展示该结构

在您的情况下,您可能需要:

foreach ($json["items"] as $item) {
    foreach ($item["product"] as $key => $value) {
        echo $key . " : " . $value;
    }
}

第一个foreach循环遍历项列表。第二个子数组访问
[“product”]
将使您获得所需的属性。

您的JSON是数组和对象的混合体。因此,数组表示法并不适用于所有项。 例如,要找到品牌用途:

foreach ($json->items as $item) {
   var_dump($item->product->brand);
}


如果我是你,我会将JSON解析为数组而不是对象。这可以通过执行以下操作来完成:

$json = json_decode($data, true);
$json = json_decode($url,true);

//you can retrieve kind, tag, id by using

$kind = $json['kind'];
$id = $json['id'];
通过将第二个参数包含在json_decode中,并将其值设置为true,可以返回一个数组。然后,您可以执行以下操作:

echo '<pre>';
print_r($json);
exit;
echo';
打印(json);
出口
这将使您了解数据的数组结构以及如何访问所需信息。例如,要提取每个项目的标题、品牌和描述,请执行以下操作:

$json = json_decode($data, true);
$json = json_decode($url,true);

//you can retrieve kind, tag, id by using

$kind = $json['kind'];
$id = $json['id'];
foreach($json['items']作为$item){
echo“Title:”.$item['product']['Title'].
; 回声“品牌:”.$item['product']['Brand'].
; echo“Description:”.$item['product']['Description'].
; }
要获得可用性,请再次使用print\r()转储阵列,并找出从阵列访问该阵列的最佳方式。

您可以使用它以正确的格式查看内容

您可以使用以下代码:

$items[] = $json['items'];

// you can retrieve the data inside the kind array

$kind_arr = $json['items'][0][]['kind'];

//similarly you can parse all the data
在这里,项本身将有一个数组,您可以使用它

<?php
$json = "[{\"name\":\"user1\",\"id\":\"940\"},{\"name\":\"user2\",\"id\":\"949\"}]";
$dec = json_decode($json);

for($idx = 0; $idx < count($dec); $idx++){
    $obj = (Array)$dec[$idx];
    echo $obj["name"];
}
?>

我们可以像这样解析JSON数组

<?php
$json = "{\"name\":\"user1\",\"id\":\"940\"}";
$dec = (Array)json_decode($json);

echo $dec["name"];
?>
 $json = '{ "a1":{ "field1":"name1", "field2":age1, "field3":"country1"
 }, 

 "a2":{ "field1":"name2", "field2":age2, "field3":"country2" },

  "a3":{ "field1":"name3", "field2":age3, "field3":"country3" } }';

  $Array = json_decode($json, true);

  foreach ($Array as $key => $value) 

  {

       echo " $key ";
       foreach ($value as $k => $val)   
      {
            echo "$k | $val <br />";
       }    
 }

类似地,JSON对象

<?php
$json = "{\"name\":\"user1\",\"id\":\"940\"}";
$dec = (Array)json_decode($json);

echo $dec["name"];
?>
 $json = '{ "a1":{ "field1":"name1", "field2":age1, "field3":"country1"
 }, 

 "a2":{ "field1":"name2", "field2":age2, "field3":"country2" },

  "a3":{ "field1":"name3", "field2":age3, "field3":"country3" } }';

  $Array = json_decode($json, true);

  foreach ($Array as $key => $value) 

  {

       echo " $key ";
       foreach ($value as $k => $val)   
      {
            echo "$k | $val <br />";
       }    
 }

$json='{“a1”:{“field1”:“name1”,“field2”:age1,“field3”:“country1”
}, 
“a2”:{“字段1”:“名称2”,“字段2”:年龄2,“字段3”:“国家2”},
“a3”:{“字段1”:“名称3”,“字段2”:年龄3,“字段3”:“国家3”};
$Array=json_decode($json,true);
foreach($key=>$value的数组)
{
回显“$key”;
foreach($k=>$val)
{
回声“$k |$val
”; } }
我原以为这样做行得通,但我没有得到任何结果。我也尝试过:foreach($json[“items”]as$item){echo$item[“title”]。“
”;}我也没有得到任何输出。盲测试并不总是最好的方法。尝试另一个建议,它将为您提供正确的路径。默认情况下,
json\u decode()
使用对象,而不是数组-因此它必须是
foreach($json->items as$item)
。您还可以执行
$json=json\u deocode($data,true)
来获取关联数组。更多信息,请参阅。