PHP:无法用多行编码 json [重复]
Posted
技术标签:
【中文标题】PHP:无法用多行编码 json [重复]【英文标题】:PHP: can't encode json with multiple rows [duplicate] 【发布时间】:2012-03-10 06:11:39 【问题描述】:在发布我的问题之前,我已经花了几个小时查看了几个类似的答案。
我正在从我的数据库中的表中检索数据,并且我想将其编码为 JSON。但是,json_encode() 的输出仅在表只有一行时才有效。如果多于一行,http://jsonlint.com/ 的测试会返回错误。
这是我的查询:
$result = mysql_query($query);
$rows = array();
//retrieve and print every record
while($r = mysql_fetch_assoc($result))
$rows['data'] = $r;
//echo result as json
echo json_encode($rows);
这让我得到以下 JSON:
"data":
"entry_id":"2",
"entry_type":"Information Relevant to the Subject",
"entry":"This is my second entry."
"data":
"entry_id":"1",
"entry_type":"My Opinion About What Happened",
"entry":"This is my first entry."
当我在http://jsonlint.com/ 运行测试时,它返回此错误:
Parse error on line 29:
..."No comment" "data":
---------------------^
Expecting 'EOF', '', ',', ']'
但是,如果我只使用 JSON 的前半部分...
"data":
"entry_id":"2",
"entry_type":"Information Relevant to the Subject",
"entry":"This is my second entry."
...或者如果我只测试后半部分...
"data":
"entry_id":"1",
"entry_type":"My Opinion About What Happened",
"entry":"This is my first entry."
...相同的测试将返回“有效 JSON”。
我想要的是能够在表中的每一行输出一个 [有效] JSON。
任何建议都将不胜感激。
【问题讨论】:
我发现您的问题对于所需的输出过于含糊。是否应该有一个包含关联数组索引数组的data
元素?还是应该有索引数组——每个数组都有一个包含关联数据的元素 (data
)?就个人而言,我认为 data
在结构中根本没有任何好处——它只是形成了不必要的数组深度。
【参考方案1】:
问题是您要为每一行输出单独的 JSON,而不是一次完成所有操作。
$result = mysql_query($query);
$rows = array();
//retrieve and print every record
while($r = mysql_fetch_assoc($result))
// $rows[] = $r; has the same effect, without the superfluous data attribute
$rows[] = array('data' => $r);
// now all the rows have been fetched, it can be encoded
echo json_encode($rows);
我所做的小改动是将数据库的每一行作为新值存储在$rows
数组中。这意味着完成后,您的 $rows
数组包含查询中的所有行,因此一旦完成,您就可以获得正确的结果。
您的解决方案的问题是您正在为数据库的一行回显有效的 JSON,但 json_encode()
不知道所有其他行,因此您将获得一系列单独的 JSON 对象,如与包含数组的单个数组相反。
【讨论】:
非常感谢!所有解决方案都有效,您的解决方案提供了最全面的解释。这不仅是正确的,而且我完全忽略了其他示例确实将 json_encode 函数放置在 while 循环之外。很抱歉没有注意到,感谢您的宝贵时间。【参考方案2】:你需要把你的 php 代码改成这样:
$result = mysql_query($query);
$rows = array();
//retrieve every record and put it into an array that we can later turn into JSON
while($r = mysql_fetch_assoc($result))
$rows[]['data'] = $r;
//echo result as json
echo json_encode($rows);
【讨论】:
【参考方案3】:我认为你应该这样做
$rows = array();
while($r = mysql_fetch_assoc($result))
$rows[]['data'] = $r;
echo json_encode($rows);
echo 应该放在循环之外。
【讨论】:
是的,但是每次脚本通过 while 循环时,这都会覆盖 $rows['data'],所以它不会工作 :) 谢谢,我没有注意到它只是复制并粘贴了他的代码,但现在已修复。【参考方案4】:我在我的 PHP 中尝试了同样的方法,所以我来了这个...
$find = mysql_query("SELECT Id,nombre, appaterno, apmaterno, semestre, seccion, carrera FROM Alumno");
//check that records exist
if(mysql_num_rows($find)>0)
$response= array();
$response["success"] = 1;
while($line = mysql_fetch_assoc($find))
$response[] = $line; //This worked for me
echo json_encode($response);
else
//Return error
$response["success"] = 0;
$response["error"] = 1;
$response["error_msg"] = "Alumno could not be found";
echo json_encode($response);
而且,在我的 android 类中......
if (Integer.parseInt(json.getString("success")) == 1)
Iterator<String> iter = json.keys();
while (iter.hasNext())
String key = iter.next();
try
Object value = json.get(key);
if (!value.equals(1))
JSONObject jsonArray = (JSONObject) value;
int id = jsonArray.getInt("Id");
if (!db.ExisteAlumo(id))
Log.e("DB EXISTE:","INN");
Alumno a = new Alumno();
int carrera=0;
a.setId_alumno(id);
a.setNombre(jsonArray.getString("nombre"));
a.setAp_paterno(jsonArray.getString("appaterno"));
a.setAp_materno(jsonArray.getString("apmaterno"));
a.setSemestre(Integer.valueOf(jsonArray.getString("semestre")));
a.setSeccion(jsonArray.getString("seccion"));
if(jsonArray.getString("carrera").equals("C"))
carrera=1;
if(jsonArray.getString("carrera").equals("E"))
carrera=2;
if(jsonArray.getString("carrera").equals("M"))
carrera=3;
if(jsonArray.getString("carrera").equals("S"))
carrera=4;
a.setCarrera(carrera);
db.addAlumno(a);
catch (JSONException e)
// Something went wrong!
【讨论】:
【参考方案5】:我一定在这个问题上花了 15 个小时。上面讨论的每一个变化都被尝试过。最后我能够得到“标准解决方案”的工作。这个问题,很奇怪,似乎是这样的:
当间隔设置超过 14 小时时,json 似乎无法解析它。 JSON 必须有限制。
$sql= "SELECT cpu_name, used, timestamp FROM tbl_cpu_use WHERE timestamp>(NOW() - INTERVAL 14 HOUR) ORDER BY id";
$result=mysql_query($sql);
if ($result)
$i=0;
$return =[];
while($row = mysql_fetch_array($result, MYSQL_NUM))
$rows[] = $row;
echo json_encode($rows);
else
echo "ERROR";
【讨论】:
以上是关于PHP:无法用多行编码 json [重复]的主要内容,如果未能解决你的问题,请参考以下文章