2013-10-07 34 views
2

有没有办法将Azure表存储实体转换为JSON?将Azure表存储实体转换为JSON

PHP中的Azure实体对象有很多元数据。有没有一种很好的方法来清除它,并返回一个只包含相关数据的JSON对象。

实体对象打印这样的事情

WindowsAzure\Table\Models\Entity Object 
     (
      [_etag:WindowsAzure\Table\Models\Entity:private] => W/"datetime'2013-10-07T04%3A19%3A37.0155205Z'" 
      [_properties:WindowsAzure\Table\Models\Entity:private] => Array 
       (
        [PartitionKey] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => 
          [_value:WindowsAzure\Table\Models\Property:private] => weather 
         ) 

        [RowKey] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => 
          [_value:WindowsAzure\Table\Models\Property:private] => 0d625293-ef40-492b-bf07-d2889597a8f4 
         ) 

        [Timestamp] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => Edm.DateTime 
          [_value:WindowsAzure\Table\Models\Property:private] => DateTime Object 
           (
            [date] => 2013-10-07 04:19:37 
            [timezone_type] => 3 
            [timezone] => UTC 
           ) 

         ) 

        [type] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => Edm.Int32 
          [_value:WindowsAzure\Table\Models\Property:private] => 1 
         ) 

        [city] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => 
          [_value:WindowsAzure\Table\Models\Property:private] => Pune 
         ) 


        [temperature] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => Edm.Int32 
          [_value:WindowsAzure\Table\Models\Property:private] => 34.7 
         ) 

        [localTime] => WindowsAzure\Table\Models\Property Object 
         (
          [_edmType:WindowsAzure\Table\Models\Property:private] => 
          [_value:WindowsAzure\Table\Models\Property:private] => 2013-10-07T04:19:31.724Z 
         ) 

       ) 

     ) 

我想有一个干净的JSON输出这样的事情

{ 
    PartitionKey:"weather", 
    RowKey: "0d625293-ef40-492b-bf07-d2889597a8f4", 
    Timestamp: "2013-10-07 04:19:37" 
    type: 1, 
    city: "Pune", 
    tempterature: 34.7 
    localTime: "2013-10-07T04:19:31.724Z" 
} 

我实现了一个循环来实现这一目标。我不确定这是否是最好的方法。

$entities = $result->getEntities(); 
     $jsonArray = array(); 

     for ($i = 0; $i < count($entities); $i++) { 
      $arr = $entities[$i]->getProperties(); 
      $tempArr = array(); 
      foreach ($arr as $key => $value) { 
       if(gettype($entities[$i]->getPropertyValue($key)) != 'object'){ 

        $tempArr[$key] = (string)$entities[$i]->getPropertyValue($key);     } 
       else 
       { 

        $tempArr[$key] = serialize($entities[$i]->getPropertyValue($key)); 
       } 
      } 
      array_push($jsonArray, $tempArr); 
     } 
     echo json_encode($jsonArray); 
+0

不确定你的意思是“PHP中的Azure实体对象有很多元数据”。你可以解释吗?此外,由于Azure表存储是无模式设计,因此不存在空属性。 –

+0

更新了问题。 –

+1

他意味着Azure实体对象有很多信息超出预期的数据。而且这个对象没有很好的文档记载,这样一个局外人无法提出合理的理解,而没有提出让他对那些知情者有些愚蠢的问题 –

回答

0

我想你已经回答了你自己的问题:)。我会推荐相同的方法,即遍历属性数组,并创建一个JSON表示。

我要提的一件事是,目前JSON并不是在Windows Azure Tables中本机支持的,但即将推出(它已在7月的Build Build会议中演示过)。当发生这种情况时,您将能够直接请求表存储以JSON格式返回数据,而不是通过此转换练习。直到那时,我认为这将是您需要遵循的方法。

3

既然Windows Azure表存储服务支持JSON,那么您可以更轻松地做到这一点。您可以在这里看到公告:Windows Azure存储版本 - 介绍CORS,JSON,分钟度量标准等。

我有一个简单的例子,说明了类似的情景在这里:http://www.contentmaster.com/azure/windows-azure-table-storage-json/

的例子显示了如何上传和使用客户端JavaScript直接从Windows Azure的表格下载。