Создайте массив JSON с php - PullRequest
0 голосов
/ 01 мая 2020

Итак, я пытаюсь создать массив, который выглядит следующим образом, чтобы я мог получить доступ к материалам, которые в нем проще. Я использую проект ESP32, и он использует библиотеку Json 6, по какой-то причине я не могу получить доступ к тому, что находится в массиве, который я создал, что я имею в виду, что это int id1 = doc [1] [ "Автоматическое приращение"]; не работает, я могу собрать только первую часть массива.

{"AutoIncrement" : [0,1,2], "Aparelho": [LED, lED1, LED2], "Status": [0,1,0]}

Я мог бы сделать sh, чтобы сделать это так, но в этом массиве у меня проблема с доступом к тому, что в нем, если у меня более 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, если вы хотите получить loook:

 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

1 Ответ

2 голосов
/ 01 мая 2020

Следующий код приносит больше вреда, чем помощи для десериализации объекта 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
...