我试图使用PHP解析JSON文件.但我现在被困住了.
这是我的JSON文件的内容:
{
"John": {
"status":"Wait"
},
"Jennifer": {
"status":"Active"
},
"James": {
"status":"Active",
"age":56,
"count":10,
"progress":0.0029857,
"bad":0
}
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所尝试的:
<?php
$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string, true);
echo $json_a['John'][status];
echo $json_a['Jennifer'][status];
Run Code Online (Sandbox Code Playgroud)
但是,因为我不知道的名字(例如'John','Jennifer')和所有可用键和值(如'age','count')事前,我想我需要创建一些foreach循环.
我会很感激这样的例子.
我将此JSON对象存储在纯文本文件中:
{
"MySQL": {
"Server": "(server)",
"Username": "(user)",
"Password": "(pwd)",
"DatabaseName": "(dbname)"
},
"Ftp": {
"Server": "(server)",
"Username": "(user)",
"Password": "(pwd)",
"RootFolder": "(rf)"
},
"BasePath": "../../bin/",
"NotesAppPath": "notas",
"SearchAppPath": "buscar",
"BaseUrl": "http:\/\/montemaiztusitio.com.ar",
"InitialExtensions": [
"nem.mysqlhandler",
"nem.string",
"nem.colour",
"nem.filesystem",
"nem.rss",
"nem.date",
"nem.template",
"nem.media",
"nem.measuring",
"nem.weather",
"nem.currency"
],
"MediaPath": "media",
"MediaGalleriesTable": "journal_media_galleries",
"MediaTable": "journal_media",
"Journal": {
"AllowedAdFileFormats": [
"flv:1",
"jpg:2",
"gif:3",
"png:4",
"swf:5"
],
"AdColumnId": "3",
"RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
"FrontendLayout": "Flat",
"AdPath": "ad",
"SiteTitle": "Monte Maíz: Tu Sitio",
"GlobalSiteDescription": "Periódico local de Monte …Run Code Online (Sandbox Code Playgroud) 我已经安装了 PHP 8.1,并开始测试我的旧项目。FILTER_SANITIZE_STRING我已经像这样使用了过滤器:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)
现在我得到这个错误:
已弃用:常量 FILTER_SANITIZE_STRING 已弃用
当我使用时也会发生同样的情况FILTER_SANITIZE_STRIPPED:
已弃用:常量 FILTER_SANITIZE_STRIPPED 已弃用
我可以用什么来代替它?
有一个奇怪的行为json_encode和json_decode我不能找到一个解决方案:
我的php应用程序调用php Web服务.webservice返回如下所示的json:
var_dump($foo):
string(62) "{"action":"set","user":"123123123123","status":"OK"}"
Run Code Online (Sandbox Code Playgroud)
现在我想在我的应用程序中解码json:
$data = json_decode($foo, true)
Run Code Online (Sandbox Code Playgroud)
但它返回NULL:
var_dump($data):
NULL
Run Code Online (Sandbox Code Playgroud)
我用的是php5.来自webservice的响应的Content-Type :( "text/html; charset=utf-8"也尝试使用"application/json; charset=utf-8")
可能是什么原因?
这并不能正常工作:
$jsonDecode = json_decode($jsonData, TRUE);
Run Code Online (Sandbox Code Playgroud)
但是,如果我复制字符串$jsonData并将其手动放入解码函数中,它确实有效.
这有效:
$jsonDecode = json_decode('{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}', TRUE);
Run Code Online (Sandbox Code Playgroud)
我输出$jsonData复制它并在解码函数中输入如上所述.然后它奏效了.但是,如果我$jsonData直接放入解码功能,它不会.
var_dump($jsonData) 说明:
string(144) "{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}"
Run Code Online (Sandbox Code Playgroud)
在$jsonData来自一个加密$_GET变量.要加密它我用这个:
$key = "SOME KEY";
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB, $iv);
$iv = rawurlencode(base64_encode($iv));
$enc = rawurlencode(base64_encode($enc));
//To Decrypt
$iv = base64_decode(rawurldecode($_GET['i']));
$enc = base64_decode(rawurldecode($_GET['e']));
$data = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv);
Run Code Online (Sandbox Code Playgroud) 我有这个JSON文件:
http://www.jeewanaryal.com/angryQuiz/eighties/json/eighties.json
我试图在PHP中解码它如下:
$json = file_get_contents('http://www.jeewanaryal.com/angryQuiz/eighties/json/eighties.json');
$data = json_decode($json);
var_dump($data);
Run Code Online (Sandbox Code Playgroud)
但是,我得到的输出是NULL.我错过了什么吗?
我正在做:
file_put_contents("txt/myfile.txt", $fileContents);
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法来强制我的文本文件是ANSI,如:
$fileContents = mb_convert_encoding($fileContents , mb_detect_encoding($fileContents , mb_detect_order(), true), 'WINDOWS-1252');
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
$fileContents = iconv("ISO-8859-1", "WINDOWS-1252", $fileContents );
Run Code Online (Sandbox Code Playgroud)
我需要ANSI,因为当我使用MS-DOS中的"type"命令(Windows 7中的cmd.exe)打开它时,文本文件应该看起来不错
如果我打开当前文件,我可以看到UTF-8 BOM:
C:\ Users\XXX>键入C:\ myfile.txt
'╗┐V01766699900000000000000005350005122013
如果我用Notepad ++打开文件并应用"转换为ANSI"我得到(我需要的):
C:\ Users\XXX>键入C:\ myfile.txt
V017666999 00000000000000005350005122013
有什么办法可以解决这个问题吗?提前致谢.(对不起,我的英语不好)
编辑:现在我知道发生了什么,文件正确创建,但下载时会添加不需要的BOM.这是问题,我只需要改变这个:
file_put_contents("txt/myfile.txt", $fileContents);
Run Code Online (Sandbox Code Playgroud)
对此(下载为二进制文件,使其保持不变):
$fileContents = mb_convert_encoding($fileContents , mb_detect_encoding($fileContents , mb_detect_order(), true), 'WINDOWS-1252');
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以删除此问题,因为正在正确创建文件.如果将文件直接从服务器复制到我的电脑并使用"类型",它看起来没问题.
该应用程序基本上是这样工作的:
1) 用户上传 CSV 文件。
2) 该文件被 PHP 通过 POST 捕获。
3) 我fopen()用fgetcsv().打开文件并用.
第一列总是有\ufeff字符。我知道这叫做 UTF-8 BOM,它是由 Microsoft Excel 生成的。但是,当我想删除它时,我不能。
我试过了: str_replace('\ufeff', '', $columns[0]);
所有,
我使用PHP向Web服务器发出JSON请求,它在变量中返回一个JSON响应.JSON响应将包含许多键和值.我从服务器获得的JSON响应中包含特殊字符.因此,我使用以下语句将其转换为UTF8,解码JSON并将其用作数组以显示到UI.
$response = json_decode(utf8_encode($jsonresponse));
Run Code Online (Sandbox Code Playgroud)
现在,我必须在JSON请求中将相同的值传递给服务器以执行某些操作.但是,当我通过
$jsonrequest = json_encode(utf8_encode($request));
Run Code Online (Sandbox Code Playgroud)
到服务器,它失败了.
以下代码成功读取特殊字符并将其显示到UI.但如果我必须将utf8_encode值传递给服务器,则会失败.
当前的整个往返代码如下:
$requestdata = json_encode($request);
$jsonresponse = //Do something to get from server;
$response = json_decode(utf8_encode($jsonresponse));
Run Code Online (Sandbox Code Playgroud)
我怎样才能修改它,以便传递确切的值来表示我从服务器的json响应中收到的内容?
码:
function updateGUI()
{
foreach ($GLOBALS['content_array'] as $i)
{
$title = $i[0];
$rating = $i[1];
echo "<li class=contentList><a class=contentListLink href=filmer_php.php?title=".$title."><span class=spantitle>".$title."</span><span class=spanrating>".asteriskifyRating($rating)."</span></a></li>";
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
资源:http:
//dist3.webbintro.se/assignments/3/movies.txt
背景:所以我创建<li>与<a>重视他们和我得到$title的<li>从一个全局变量(并不重要).问题是查询字符串不包含完整字符串,因为某些字符串$title包含空格,因此它们会在空格处被截断.我已经尝试使用转义字符,\"但没有工作,我找不到任何关于如何正确解析的好文章..我也希望如果解决方案不包括正则表达式,但如果这只能用正则表达式解决那就这样吧.
EDIT1: context:好的,urlencode修复了最大的问题.在"星球大战"之前,我还有一个mojibake广场,有什么建议导致这个问题吗?
完整代码:http: //jsfiddle.net/Uv5bV/
EDIT2: 删除了utf-8 BOM,从这个线程获得了解决方案:如何在"<!DOCTYPE>"之前删除多个UTF-8 BOM序列?
码:
function remove_utf8_bom($text)
{
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
Run Code Online (Sandbox Code Playgroud)