#php #json
#php #json
Вопрос:
У меня есть вложенный объект JSON, и я хочу сохранить значения в текстовый файл. Это вложенный объект Json
"objectJSON":{
"alt":"136.22",
"lat":"46.7484",
"lng":"33.0685"
}
Я использую следующий PHP-код для сохранения значений в txt.file
<?php
header("Content-type: application/json");
$json = file_get_contents("php://input");
$obj = json_decode($json);
$decoded = base64_decode(json_encode($obj->data));
$encoded = json_encode($obj->objectJSON);
$fp = @fopen("TMP.txt", "a"); //Open and write into TMP.txt
fwrite($fp, $encoded);
fwrite($fp,"rn");
fclose($fp);
?>
И вот значения в TMP.txt файл
"{"alt":136.22,"lat":46.7484,"lng":33.0685}"
И вот в чем проблема:
Что мне нужно изменить / добавить, чтобы сохранить только значение «alt» в TMP.txt файл?
ВОТ БОЛЬШЕ ИНФОРМАЦИИ О МОЕМ ПРОЕКТЕ.
Я получаю данные через узел lora на шлюз lora, который отправляет их на мой сервер lora. Вот часть кода узла lora, который был загружен на него:
void GPSWrite()
{
/*Convert GPS data to format*/
datastring1 =dtostrf(flat, 0, 6, gps_lat);
datastring2 =dtostrf(flon, 0, 6, gps_lon);
//datastring3 =dtostrf(falt, 0, 2, gps_alt);
if(flon!=1000.000000)
{
strcat(gps_lon,",");
strcat(gps_lon,gps_lat);
//strcat(gps_lon,",");
//strcat(gps_lon,gps_alt);
int i = 0;
for(i = 0; i < 2; i )
{
//datasend.toFloat();
atof(gps_lon);
//Serial.println((char*)datasend);
Serial.println("Testing converted data:");
Serial.println(gps_lon);
// atof(gps_alt);
// Serial.print(gps_alt);
}
strcpy(datasend,gps_lon); //the format of datasend is longtitude,latitude,altitude
Serial.print("########### ");
Serial.print("NO.");
Serial.print(count);
Serial.println(" ###########");
Serial.println("The longtitude and latitude are:");
Serial.print("[");
Serial.print((char*)datasend);
Serial.print("]");
Serial.print("");
/*
for(int k = 0; k < 20;k )
{
Serial.print("[");
Serial.print(datasend[k], HEX);
Serial.print("]");
}
Serial.println("");
Serial.println("");*/
count ;
}
int32_t lat = flat * 10000;
int32_t lng = flon * 10000;
datasend[0] = lng;
datasend[1] = lng >> 8;
datasend[2] = lng >> 16;
datasend[3] = lat;
datasend[4] = lat >> 8;
datasend[5] = lat >> 16;
smartdelay(1000);
}
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
{
gps.encode(ss.read());
}
} while (millis() - start < ms);
}
void loop() {
os_runloop_once();
}
Сервер приложений декодирует данные с помощью следующей функции:
function Decode(fPort, bytes) {
var decoded = {};
var hexString=bin2HexStr(bytes);
return rakSensorDataDecode(hexString);
}
// convert array of bytes to hex string.
// e.g: 0188053797109D5900DC140802017A0768580673256D0267011D040214AF0371FFFFFFDDFC2E
function bin2HexStr(bytesArr) {
var str = "";
for(var i=0; i<bytesArr.length; i ) {
var tmp = (bytesArr[i] amp; 0xff).toString(16);
if(tmp.length == 1) {
tmp = "0" tmp;
}
str = tmp;
}
return str;
}
// convert string to short integer
function parseShort(str, base) {
var n = parseInt(str, base);
return (n << 16) >> 16;
}
// convert string to triple bytes integer
function parseTriple(str, base) {
var n = parseInt(str, base);
return (n << 8) >> 8;
}
// decode Hex sensor string data to object
function rakSensorDataDecode(hexStr) {
var str = hexStr;
var myObj = {};
while (str.length > 4) {
var flag = parseInt(str.substring(0, 4), 16);
{
myObj.lat = (bytes[3] | bytes[4]<<8 | bytes[5]<<16 | (bytes[5] amp; 0x80 ? 0xFF<<24 : 0)) / 10000;
myObj.lng = (bytes[0] | bytes[1]<<8 | bytes[2]<<16 | (bytes[2] amp; 0x80 ? 0xFF<<24 : 0)) / 10000;
myObj.alt = ((bytes[6] << 8) bytes[7])/100;
str = str.substring(22);
}
}
return myObj;
}
итак, я получаю через свой сервер приложений следующие результаты:
полученные данные
Затем я использую php-скрипт для сохранения данных в txt, файле. Как я уже говорил вам, проблема в том, что я могу сохранить все данные, но не могу сохранить, например, только высоту.
Комментарии:
1. итак, вы хотите сохранить в файле
"{"alt":136.22}"
или только136.22
2. Я хотел бы сохранить только 136,22
3. ок опубликовал ответ
4. это
$encoded->alt
даст вам значение alt5. удалите всю путаницу с кодированием / декодированием base64 и просто используйте
$obj->objectJSON->alt
вы не перекодируете его, если хотите строку из объекта
Ответ №1:
Единственное, что вам нужно сделать, это декодировать, а затем закодировать и написать правильный:
$json = file_get_contents("php://input");
$obj = json_decode($json);
file_put_contents("TMP.txt", json_encode($obj->objectJSON->alt));
Если вы хотите добавить, то:
file_put_contents("TMP.txt",
file_get_contents("TMP.txt") . json_encode($obj->objectJSON->alt));
Но это не будет допустимым JSON в файле.
Комментарии:
1. » это не сработало » очень бесполезно. Не позволяйте людям догадываться об ошибке или проблеме, с которой вы столкнулись, опишите ее.
2. Извините, он возвращает пустую строку
3. file_put_contents(«TMP.txt «, json_encode($obj-> objectJSON-> alt)); возвращает «null»
4. file_put_contents(«TMP.txt «, file_get_contents(«TMP.txt «) . json_encode($obj->objectJSON-> alt)); также возвращает «null»
Ответ №2:
Вы используете закодированные данные, вместо этого используйте декодированные данные, если хотите получить доступ к атрибуту ‘alt’, вот пример :
<?php
$obj = (object) [
"objectJSON" => [
'alt' => '136.22',
'lat' => '46.7484',
'lng' => '33.0685'
]
];
$encoded = json_encode($obj->objectJSON);
$decoded = json_decode($encoded);
$fp = @fopen("TMP.txt", "a"); //Open and write into TMP.txt
fwrite($fp, $decoded->alt);
fwrite($fp,"rn");
fclose($fp);
?>
Комментарии:
1. Спасибо за вашу помощь, я отредактировал свой вопрос, предоставив дополнительную информацию о проекте
Ответ №3:
Вам просто нужно извлечь значение из object
:
$fp = @fopen("TMP.txt", "a"); //Open and write into TMP.txt
fwrite($fp, $decoded->alt);
// ^^^^^^^
fwrite($fp,"rn");
fclose($fp);
Комментарии:
1. возвращает пустую строку
2. @BillCheimaras попробуйте сейчас
3. Спасибо всем за вашу помощь, я попробую еще раз в понедельник, потому что у меня не будет доступа на ПК в эти выходные
4. Наконец-то у меня есть доступ к моему компьютеру через vnc Viewer. « $fp = @fopen(«TMP.txt «, «a»); //Открыть и записать в TMP.txt fwrite($fp, $ decoded-> alt); // ^^^^^^^ fwrite($fp,»r n»); fclose($fp); « возвращает пустую строку
Ответ №4:
Наконец, я могу сохранить свои данные в текстовом файле и одновременно вставить свои данные в базу данных MySQL. Спасибо всем за вашу помощь. Вот скрипт PHP
<?php
header("Content-type: application/json");
$json = file_get_contents("php://input");
$obj = json_decode($json);
$decoded = base64_decode(json_encode($obj->data));
$fp = @fopen("TMP.txt", "a"); //Open and write into TMP.txt
fwrite($fp,$decoded);
fwrite($fp,"rn");
fclose($fp);
$server = "#######";
$username = "#######";
$password = "#######";
$DB = "#######";
$conn = new mysqli($server, $username, $password, $DB);
if ($conn->connect_error)
{
die("Connection failed: " . $conn->connect_error);
}
$insert = "INSERT INTO gpssensor(longitude, latitude) VALUES ($decoded)";
$conn->query($insert);
$conn->close();
?>