PHP を使用して JSON ネストされた値を txt.file または Mysql データベースとして保存する方法

okwaves2024-01-25  7

ネストされた 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}"

そしてここに問題があります:

「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] & 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、ファイルに保存します。すでにお話ししたように、問題はすべてのデータを保存できるのに、たとえば高度だけを保存できないことです。

つまり、ファイル「{\"alt\":136.22}」に保存したいと考えています。または 136.22 のみ

– アルベルト

2020 年 9 月 3 日 21:31

136.22 だけを保存したい

– ビル・チェイマラス

2020 年 9 月 3 日 21:31

わかりました、答えを投稿しました

– アルベルト

2020 年 9 月 3 日 21:34

この $encoded->alt により alt 値が得られます

– アミン・クイス

2020 年 9 月 3 日 22:09

1

Base64 デコードのエンコード/デコードの混乱をすべて取り除き、単純に $obj->objectJSON-> を使用します。オブジェクトから文字列が必要な場合は再エンコードしないでください。

– ローレンス・シェローン

2020 年 9 月 3 日 22:56



------------------------

必要なのは、デコードしてからエンコードして、適切なものを書き込むことだけです。

$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 ではありません。

4

2

「うまくいきませんでした」とても役に立たない。発生しているエラーや問題について他人に推測させず、それを説明してください。

– インクレディブルハット

2020 年 9 月 3 日 23:49

申し訳ありませんが、空の行が返されます

– ビル・チェイマラス

202 年 9 月 4 日0、4:01

file_put_contents("TMP.txt", json_encode($obj->objectJSON->alt)); 「null」を返します

– ビル・チェイマラス

2020 年 9 月 4 日 4:45

file_put_contents("TMP.txt", file_get_contents("TMP.txt") . json_encode($obj->objectJSON->alt)); 「null」も返します。

– ビル・チェイマラス

2020 年 9 月 4 日 4:48



------------------------

エンコードされたデータを使用しています。「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,"\r\n");
        fclose($fp);


?>

1

ご協力ありがとうございます。プロジェクトに関する詳細情報を提供して質問を編集しました。

– ビル・チェイマラス

2020 年 9 月 5 日 8:33



------------------------

オブジェクトから値を抽出するだけです。

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

4

空の行が返されます

– ビル・チェイマラス

2020 年 9 月 4 日 4:49

@BillCheimaras 今すぐ試してください

– アルベルト

9 月 4 日2020 年 9 時 49 分

ご協力いただきありがとうございます。今週末は PC にアクセスできないため、月曜日にもう一度試してみます。

– ビル・チェイマラス

2020 年 9 月 5 日 7:41

ついに、vnc viewer 経由で PC にアクセスできるようになりました。 ``` $fp = @fopen("TMP.txt", "a"); //TMP.txt を開いて書き込みます fwrite($fp, $decoded->alt); // ^^^^^^^ fwrite($fp,"\r\n"); fclose($fp); ``` は空行を返します

– ビル・チェイマラス

2020 年 9 月 5 日 8:14



------------------------

最後に、データを txt ファイルに保存し、同時に 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,"\r\n");
      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();

?>


総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。