在发布问题之前,我花了几个小时查看了几个相似的答案。
我正在从数据库中的表中检索数据,我想将其编码为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."
}
}
...相同的测试将返回“Valid JSON”。
我想要的是能够在表格的每一行输出一个[有效] JSON。
非常感谢任何建议。
答案 0 :(得分:14)
问题是你为每一行吐出单独的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对象,而不是包含数组的单个。
答案 1 :(得分:3)
您需要将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);
答案 2 :(得分:0)
我认为你应该这样做
$rows = array();
while($r = mysql_fetch_assoc($result)){
$rows[]['data'] = $r;
}
echo json_encode($rows);
echo应该放在循环之外。
答案 3 :(得分:0)
我在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!
}
}
答案 4 :(得分:0)
我必须花15个小时来解决这个问题。尝试了上面讨论的每个变体。最后,我得到了标准解决方案&#39;工作。奇怪的是,这个问题似乎是这样的:
当间隔设置超过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";
}