php - 如何使用 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、文件中。正如我告诉你的那样,问题是我可以保存所有数据,但不能只保存海拔高度。
解决方案
您只需要从中提取值object
:
$fp = @fopen("TMP.txt", "a"); //Open and write into TMP.txt
fwrite($fp, $decoded->alt);
// ^^^^^^^
fwrite($fp,"\r\n");
fclose($fp);
推荐阅读
- javascript - 如何在 vuex 4.0 中使用 vue set
- python - 是否可以在 Python 中使用 IDesktopWallpaper?
- c# - 创建一个类似 Action.Invoke 的方法
- git - 在我的 Visual Studio 2019 中,我没有“Git”
- xcode - 如何通过 cli 使用开发配置文件导出 mac 应用程序
- azure - 如何使用 Azure APIM 将主键发送给用户?
- javascript - 为什么我需要为路由参数使用大括号?
- python - 我如何做到这一点,以便我可以向一个函数添加多个输入,并将这些输入作为单独的元素添加到列表中?
- r - R:忽略未知的美学:label1
- sql - SQL选择两个表没有相似的条目和不同的列数