首页 > 解决方案 > 如何使用 PHP 将 JSON 嵌套值保存为 txt.file 或 Mysql 数据库

问题描述

我有一个嵌套的 JSON 对象,我想将值保存到一个 txt 文件中。这是嵌套的 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,"\r\n");
        fclose($fp);

?>

这是 TMP.txt 文件中的值

"{\"alt\":136.22,\"lat\":46.7484,\"lng\":33.0685}"

这就是问题所在:

我必须更改/添加什么以仅保存 TMP.txt 文件中的“alt”值?

这里有更多关于我的项目的信息。

我通过 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] & 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] & 0x80 ? 0xFF<<24 : 0)) / 10000;
        myObj.lng = (bytes[0] | bytes[1]<<8 | bytes[2]<<16 | (bytes[2] & 0x80 ? 0xFF<<24 : 0)) / 10000;
        myObj.alt = ((bytes[6] << 8) + bytes[7])/100;
        str = str.substring(22); 
    
    }
  }

  return myObj;
}

所以我通过我的应用程序服务器得到以下结果: 收到的数据

然后我使用 php 脚本将数据保存在 txt、文件中。正如我告诉你的那样,问题是我可以保存所有数据,但不能只保存海拔高度。

标签: phpjson

解决方案


您只需要从中提取值object

$fp = @fopen("TMP.txt", "a");  //Open and write into TMP.txt
fwrite($fp, $decoded->alt);
//                  ^^^^^^^
fwrite($fp,"\r\n");
fclose($fp);

推荐阅读