suchen

Heim  >  Fragen und Antworten  >  Hauptteil

So ersetzen und speichern Sie JSON-Schlüsselinhalte in Shopware 6.5 mit PHP

Ich arbeite an einem Shopware-Projekt und muss ein JSON einrichten, das alle verarbeiteten Bestellungen enthält.

Dieser JSON wird in einem Verzeichnis gespeichert, das ich gefunden und an eine Variable $fil übergeben habe.

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

$file_contents = file_get_contents($fil);

Der erhaltene JSON wird in der Variablen $fil gespeichert und dann an die Variable $jsonData übergeben.

$jsonData = $fil;

Ich versuche, den Wert des Schlüssels unten zu ersetzen, indem ich den JSON in ein assoziatives Array dekodiere.

$data = json_decode($jsonData, true);

Die zu ersetzenden Schlüssel sind wie folgt (versuchen Sie, die ID zu ersetzen)

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

Dann habe ich versucht, es wieder in einer Variablen modifiedJsonData zu speichern und es wieder im Verzeichnis zu ersetzen.

$modifiedJsonData = json_encode($data, JSON_PRETTY_PRINT);

file_put_contents($fil, $modifiedJsonData);

Es scheint teilweise, aber nicht vollständig zu funktionieren und nicht nur (ID) zu ersetzen.

Wie unten gezeigt:$data['entity']['payments'][0]['state']['id']

Es ersetzt den gesamten JSON-Inhalt, nicht nur den oben genannten Inhalt. Der JSON-Inhalt sollte mehr als der folgende Inhalt sein:

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

Bitte helfen Sie, ich habe möglicherweise etwas falsch gemacht

P粉306523969P粉306523969445 Tage vor696

Antworte allen(2)Ich werde antworten

  • 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);

    Antwort
    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"

    Antwort
    0
  • StornierenAntwort