搜尋

首頁  >  問答  >  主體

使用PHP將Shopware 6.5中的JSON鍵內容替換並儲存的方法

我正在處理一個Shopware項目,需要設定一個包含所有已處理訂單的JSON。

這個JSON被儲存在一個目錄中,我已經找到並將其傳遞給一個變數$fil

$filer =  $order1->getOrderNumber() . '_' . $country2->getIso() . '.json';
$fil = __DIR__ . '/' . $filer;

$file_contents = file_get_contents($fil);

取得的JSON儲存在變數$fil中,然後傳遞給變數$jsonData

$jsonData = $fil;

我試圖透過將JSON解碼為關聯數組來替換下面的鍵的值。

$data = json_decode($jsonData, true);

要替換的鍵如下(嘗試替換ID)

$data['entity']['payments'][0]['state']['id'] = $logMessageId;

然後,我嘗試將其保存回變數modifiedJsonData並替換回目錄。

$modifiedJsonData = json_encode($data, JSON_PRETTY_PRINT);

file_put_contents($fil, $modifiedJsonData);

它似乎部分工作,但不完全,而不僅僅是替換(ID)。

如下:$data['entity']['payments'][0]['state']['id']

#它取代了整個JSON的內容,而不僅僅是上述內容,JSON內容應該比下面的內容更多:

{
    "entity": {
        "payments": [
            {
                "state": {
                    "id": #####
                }
            }
        ]
    }
}

請幫忙,我可能做錯了什麼

P粉306523969P粉306523969445 天前695

全部回覆(2)我來回復

  • P粉762730205

    P粉7627302052023-09-10 15:55:36

    我還能透過以下方式繞過它:

    $data = json_decode($jsonData, true, 512, JSON_BIGINT_AS_STRING);
    
    
    
        $data['entity']['payments'][0]['state']['id'] = $logMessageId;
    
            
            
    
    
    
    $modifiedJsonData = json_encode($data, JSON_PRETTY_PRINT);
            
      
      
    
      $existingData = json_decode(file_get_contents($fil), true);
            
         
      
    
      $existingData['entity']['payments'][0]['state']['id'] = $data['entity']['payments'][0]['state']['id'];
    
    
     $updatedJsonData = json_encode($existingData, JSON_PRETTY_PRINT);
            
       
      
    
      file_put_contents($fil, $updatedJsonData);

    回覆
    0
  • P粉438918323

    P粉4389183232023-09-10 11:11:10

    在使用json_decode()解碼JSON時,確保$jsonData中有正確的JSON文本,並且在當前場景下使用兩個標誌,第一個標誌始終使用,第二個標誌更具體:

    1. JSON_THROW_ON_ERROR
    2. #JSON_BIGINT_AS_STRING

    範例:

    $data = json_decode($jsonData, true, flags: JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
    

    (自PHP 8.0起)

    $data = json_decode($jsonData, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
    

    (自PHP 7.3起)

    JSON_THROW_ON_ERROR

    #之所以只看到$data['entity']['payments'][0]['state']['id']的JSON,是因為$data = json_decode(...)操作回傳了null,因為解析失敗。使用JSON_THROW_ON_ERROR會將任何錯誤轉換為異常,這樣更容易發現,因為它會在錯誤時停止腳本的執行。

    這樣可以避免在後續輸出中尋找錯誤。

    JSON_BIGINT_AS_STRING

    #

    BIGINT是指BigInt(ECMA 262),它是JavaScript中用於非常大的(負數和正數)整數的數字值類型,json_decode()在處理時可能會遺失精確度(3v4l.org演示):

    var_dump(json_decode('4599999999999999999999999999999999'));
    var_dump(json_decode('4599999999999999999999999999999999', true, 512, JSON_BIGINT_AS_STRING));
    
    float(4.6E+33)
    string(34) "4599999999999999999999999999999999"

    #

    回覆
    0
  • 取消回覆