2012-03-09 52 views
2

我是cakephp的新手。我试图将json输出保存为webroot中的文件。我也想将文件读入数组中。CakePHP读取和写入json文件。

我知道我们可以使用json_encode($ array)将数组输出为json对象。但我坚持创建和阅读json文件到数组中。

我很感激任何帮助。

+0

您确定要将文件放入webroot中并可供普通大众查看吗?下面的答案显示了我认为回答你的问题的json_encode和json_decode的使用。 – Andy 2012-03-09 12:00:04

+0

@Andy我知道它是可用的,但我不知道如何将它存储在webroot之外。我可以将它存储在webroot之外吗?我感谢任何帮助。 – 2012-03-09 12:13:17

+1

嗨,当然可以。取决于你是否打算保留它,你可以将它存储在app/tmp /目录下的子目录中。不要使用webroot作为你的基本目录,而应考虑使用TMP或类似的东西(查看http://www.ossassociatesinc.com/Cakephp-manual/ch11s03.html)。只要确保你chmod目录允许Apache用户rw访问。 file_get_contents和file_put_contents不需要通过URL访问文件,并且可以采用路径名称(http://php.net/manual/en/function.file-get-contents.php) – Andy 2012-03-09 12:25:12

回答

7
//write 
$json = '{"key":"value"}'; 
$file = new File('/path/to/file', true); 
$file->write($json); 
//read 
$file = new File('/path/to/file'); 
$json = $file->read(true, 'r'); 
$json2array = json_decode($json); 
+0

感谢您的回答..您让它看起来很简单..我感谢你的帮助。我想知道我们是否可以将文件保存在webroot之外。谢谢。 – 2012-03-09 12:14:57

+0

您可以将文件保存在php根文件夹的任何位置。 – cetver 2012-03-09 13:07:16

3

注:此代码属于您的模型或控制器的方法中。

尽管cetver的回答在技术上是正确的,但它不是很“cakey”。

对于CakePHP的具体我会做到以下几点:

$json = '{"key":"value"}'; 
$json2 = json_encode(array("a" => 1, "b" => 2)); 
$path = APP . '[YOUR FOLDER NAME]' . DS . 'json'; 
$path2 = APP . '[YOUR FOLDER NAME]' . DS . 'json2'; 
$jsonFromFile; 
$json2FromFile; 

//write 
if(!file_exists($path)) 
    file_put_contents($path, $json); 

if(!file_exists($path2)) 
    file_put_contents($path2, $json2); 

//read 
if(!file_exists($path)) 
    $jsonFromFile = file_get_contents($path, true); 
if(!file_exists($path2)) 
    $json2FromFile = file_get_contents($path2, true); 

说明:

  • $ JSON是一个标准的预先写好的JSON字符串,在这里没有混乱
  • $ json2显示你的例如你可以如何编码和阵列(或对象)为您的存储目的的JSON字符串
  • $ path利用一些CakePHP常量。 “APP”,它给你一个可解析的路径到你的应用程序文件夹&“DS”作为系统安全的目录分隔符
  • 然后我们检查以确保我们的文件不存在,在这一点上我们使用方法“ file_put_contents“来写我们的文件。

快乐编码。

+0

除了问题是关于如何读取平坦的json文件的内容。另外,对于你的答案是“cakey”,它应该包含一个在控制器或数据源中这样做的建议。 – 2016-06-17 18:14:05

+1

OP没有提供他在哪里执行这个逻辑的上下文,那么为什么要限制我的答案呢?我的答案的“cakey”方面是利用Cake提供的常量来确保应用程序是从环境到环境的门户,对您的配置毫不关心。在提及我错过了我的答案的“读取”部分时,你是正确的。我会更新。 – pimbrouwers 2016-06-17 18:24:20

+0

很酷。一个问题是,有太多的“CakePhp开发人员”将代码直接放入视图文件或跨多个控制器方法复制面食。不暗示Cake标准的解决方案并不真正描述Cake解决方案,而是通用解决方案(在这种情况下使用Cake常量)。 – 2016-06-17 22:26:47