recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment remplacer et enregistrer le contenu de la clé JSON dans Shopware 6.5 à l'aide de PHP

Je travaille sur un projet Shopware et j'ai besoin de mettre en place un JSON contenant toutes les commandes traitées.

Ce JSON est stocké dans un répertoire que j'ai trouvé et passé à une variable $fil.

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

$file_contents = file_get_contents($fil);

Le JSON obtenu est stocké dans la variable $fil, puis transmis à la variable $jsonData.

$jsonData = $fil;

J'essaie de remplacer la valeur de la clé ci-dessous en décodant le JSON dans un tableau associatif.

$data = json_decode($jsonData, true);

Les clés à remplacer sont les suivantes (essayez de remplacer l'ID)

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

Ensuite, j'ai essayé de le sauvegarder dans une variable modifiedJsonData et de le remplacer dans le répertoire.

$modifiedJsonData = json_encode($data, JSON_PRETTY_PRINT);

file_put_contents($fil, $modifiedJsonData);

Il semble fonctionner partiellement, mais pas complètement, et ne se contente pas de remplacer (ID).

Comme indiqué ci-dessous :$data['entity']['payments'][0]['state']['id']

Il remplace l'intégralité du contenu JSON, pas seulement le contenu ci-dessus, le contenu JSON doit être plus que le contenu suivant :

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

S'il vous plaît, aidez-moi, j'ai peut-être fait quelque chose de mal

P粉306523969P粉306523969446 Il y a quelques jours697

répondre à tous(2)je répondrai

  • P粉762730205

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

    Je peux aussi le contourner par :

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

    répondre
    0
  • P粉438918323

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

    Lors du décodage du JSON à l'aide de json_decode(), assurez-vous d'avoir le texte JSON correct dans $jsonData et utilisez deux indicateurs dans le scénario actuel, le premier indicateur est toujours utilisé et le deuxième indicateur est plus spécifique :

    1. JSON_THROW_ON_ERROR
    2. JSON_BIGINT_AS_STRING

    Exemple :

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

    (Depuis PHP 8.0)

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

    (Depuis PHP 7.3)

    JSON_THROW_ON_ERROR

    La raison pour laquelle je ne vois que le JSON de $data['entity']['payments'][0]['state']['id'] est parce que $data = json_decode L'opération (...) a renvoyé null car l'analyse a échoué. L'utilisation de $data['entity']['payments'][0]['state']['id']的JSON,是因为$data = json_decode(...)操作返回了null,因为解析失败。使用JSON_THROW_ON_ERROR convertira toutes les erreurs en exceptions, qui sont plus faciles à repérer car cela arrêtera l'exécution du script en cas d'erreur.

    Cela évite de rechercher des erreurs dans les sorties ultérieures.

    JSON_BIGINT_AS_STRING

    BIGINT fait référence à BigInt (ECMA 262), qui est un type de valeur numérique en JavaScript pour les très grands entiers (négatifs et positifs), dont json_decode() peut perdre en précision lors du traitement (Démo 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"

    répondre
    0
  • Annulerrépondre