使用 php 创建一个 JSON 数组
Create a JSON array with php
因此,我正在尝试创建一个如下所示的数组,以便我可以更轻松地访问其中的内容。我正在使用 ESP32 项目,它使用 Json 6 库,出于某种原因我无法访问我创建的数组中的内容,我的意思是这个 int id1 = doc[1 ]["AutoIncrement"];不起作用,我只能收集数组的第一部分。
{"AutoIncrement" : [0,1,2], "Aparelho": [LED, lED1, LED2], "Status": [0,1,0]}
我可以做到这样,但是在这个数组中,如果我有超过 2 行的内容,我在访问其中的内容时会遇到问题。
[{"AutoIncrement":"1","Aparelho":"LED","Status":"0"},{"AutoIncrement":"2","Aparelho":"LED1","Status":"1"},{"AutoIncrement":"3","Aparelho":"LED2","Status":"0"}]
这是 php 代码:
sql = "SELECT * FROM dados";
$result = mysqli_query($conn, $sql);
$json_array = array();
while($row = mysqli_fetch_assoc($result))
{
$json_array[] = array(
'AutoIncrement' => $row["AutoIncrement"],
'Aparelho' => $row["aparelho"],
'Status' => $row["situacao"],
);
}
return json_encode($json_array);
}
$file_name = 'dadosjson' . '.json';
ESP32部分想看的话:
String payload = http.getString();
Serial.println("\nStatuscode: "+ String(httpCode));
Serial.println(payload);
char json[500];
payload.replace(" ", "");
payload.replace("\n", "");
payload.trim();
payload.remove(0,1);
payload.toCharArray(json, 500);
StaticJsonDocument<200> doc;
deserializeJson(doc, json);
//Isso nao depende do nome no banco de dados, depende do nome dentro de action.php
const char* nome = doc[0]["Aparelho"];
int stat = doc[0]["Status"];
int id1 = doc[1]["AutoIncrement"];
const char* nome1 = doc[1]["Aparelho"];
int stat1 = doc[1]["Status"];
int id2 = doc["AutoIncrement"][2];
const char* nome2 = doc["Aparelho"][2];
int stat2 = doc["Status"][2];
Serial.println(id2);
打印 id2 的结果是 0,但应该是 2
以下代码对 JSON 对象的反序列化弊大于利,确实没有必要删除它。
payload.replace(" ", "");
payload.replace("\n", "");
payload.trim();
payload.remove(0,1);
如果您的负载如下所示:
"[{\"AutoIncrement\":\"1\",\"Aparelho\":\"LED\",\"Status\":\"0\"}, {\"AutoIncrement\":\"2\",\"Aparelho\":\"LED1\",\"Status\":\"1\"}, \"AutoIncrement\":\"3\",\"Aparelho\":\"LED2\",\"Status\":\"0\"}]";
你只需要将String对象直接转换为c char数组,然后反序列化即可。您在访问反序列化对象时也有错误,例如 doc["AutoIncrement"][2]
,而它应该是 doc[2]["AutoIncrement"]
。
String payload = http.getString();
Serial.println("\nStatuscode: "+ String(httpCode));
Serial.println(payload);
// converting String payload into a c char array
int length = payload.length() + 1;
char json[length];
payload.toCharArray(json, length);
StaticJsonDocument<200> doc;
deserializeJson(doc, json);
//LED
int id = doc[0]["AutoIncrement"];
const char* nome = doc[0]["Aparelho"];
int stat = doc[0]["Status"];
//LED 1
int id1 = doc[1]["AutoIncrement"];
const char* nome1 = doc[1]["Aparelho"];
int stat1 = doc[1]["Status"];
//LED 2
int id1 = doc[2]["AutoIncrement"];
const char* nome2 = doc[2]["Aparelho"];
int stat1 = doc[2]["Status"];
Serial.println(id);
Serial.println(nome);
Serial.println(stat);
Serial.println(id1);
Serial.println(nome1);
Serial.println(stat1);
Serial.println(id2);
Serial.println(nome2);
Serial.println(stat2);
这将产生正确的结果:
1
LED
0
2
LED1
1
3
LED2
0
因此,我正在尝试创建一个如下所示的数组,以便我可以更轻松地访问其中的内容。我正在使用 ESP32 项目,它使用 Json 6 库,出于某种原因我无法访问我创建的数组中的内容,我的意思是这个 int id1 = doc[1 ]["AutoIncrement"];不起作用,我只能收集数组的第一部分。
{"AutoIncrement" : [0,1,2], "Aparelho": [LED, lED1, LED2], "Status": [0,1,0]}
我可以做到这样,但是在这个数组中,如果我有超过 2 行的内容,我在访问其中的内容时会遇到问题。
[{"AutoIncrement":"1","Aparelho":"LED","Status":"0"},{"AutoIncrement":"2","Aparelho":"LED1","Status":"1"},{"AutoIncrement":"3","Aparelho":"LED2","Status":"0"}]
这是 php 代码:
sql = "SELECT * FROM dados";
$result = mysqli_query($conn, $sql);
$json_array = array();
while($row = mysqli_fetch_assoc($result))
{
$json_array[] = array(
'AutoIncrement' => $row["AutoIncrement"],
'Aparelho' => $row["aparelho"],
'Status' => $row["situacao"],
);
}
return json_encode($json_array);
}
$file_name = 'dadosjson' . '.json';
ESP32部分想看的话:
String payload = http.getString();
Serial.println("\nStatuscode: "+ String(httpCode));
Serial.println(payload);
char json[500];
payload.replace(" ", "");
payload.replace("\n", "");
payload.trim();
payload.remove(0,1);
payload.toCharArray(json, 500);
StaticJsonDocument<200> doc;
deserializeJson(doc, json);
//Isso nao depende do nome no banco de dados, depende do nome dentro de action.php
const char* nome = doc[0]["Aparelho"];
int stat = doc[0]["Status"];
int id1 = doc[1]["AutoIncrement"];
const char* nome1 = doc[1]["Aparelho"];
int stat1 = doc[1]["Status"];
int id2 = doc["AutoIncrement"][2];
const char* nome2 = doc["Aparelho"][2];
int stat2 = doc["Status"][2];
Serial.println(id2);
打印 id2 的结果是 0,但应该是 2
以下代码对 JSON 对象的反序列化弊大于利,确实没有必要删除它。
payload.replace(" ", "");
payload.replace("\n", "");
payload.trim();
payload.remove(0,1);
如果您的负载如下所示:
"[{\"AutoIncrement\":\"1\",\"Aparelho\":\"LED\",\"Status\":\"0\"}, {\"AutoIncrement\":\"2\",\"Aparelho\":\"LED1\",\"Status\":\"1\"}, \"AutoIncrement\":\"3\",\"Aparelho\":\"LED2\",\"Status\":\"0\"}]";
你只需要将String对象直接转换为c char数组,然后反序列化即可。您在访问反序列化对象时也有错误,例如 doc["AutoIncrement"][2]
,而它应该是 doc[2]["AutoIncrement"]
。
String payload = http.getString();
Serial.println("\nStatuscode: "+ String(httpCode));
Serial.println(payload);
// converting String payload into a c char array
int length = payload.length() + 1;
char json[length];
payload.toCharArray(json, length);
StaticJsonDocument<200> doc;
deserializeJson(doc, json);
//LED
int id = doc[0]["AutoIncrement"];
const char* nome = doc[0]["Aparelho"];
int stat = doc[0]["Status"];
//LED 1
int id1 = doc[1]["AutoIncrement"];
const char* nome1 = doc[1]["Aparelho"];
int stat1 = doc[1]["Status"];
//LED 2
int id1 = doc[2]["AutoIncrement"];
const char* nome2 = doc[2]["Aparelho"];
int stat1 = doc[2]["Status"];
Serial.println(id);
Serial.println(nome);
Serial.println(stat);
Serial.println(id1);
Serial.println(nome1);
Serial.println(stat1);
Serial.println(id2);
Serial.println(nome2);
Serial.println(stat2);
这将产生正确的结果:
1
LED
0
2
LED1
1
3
LED2
0