Maison > Questions et réponses > le corps du texte
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粉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);
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 :
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"