Rumah > Soal Jawab > teks badan
Saya sedang mengusahakan projek Shopware dan perlu menyediakan JSON yang mengandungi semua pesanan yang diproses.
JSON ini disimpan dalam direktori yang saya temui dan hantar kepada pembolehubah $fil.
$filer = $order1->getOrderNumber() . '_' . $country2->getIso() . '.json'; $fil = __DIR__ . '/' . $filer; $file_contents = file_get_contents($fil);
JSON yang diperolehi disimpan dalam pembolehubah $fil, dan kemudian dihantar ke pembolehubah $jsonData.
$jsonData = $fil;
Saya cuba menggantikan nilai kunci di bawah dengan menyahkod JSON ke dalam tatasusunan bersekutu.
$data = json_decode($jsonData, true);
Kunci yang perlu diganti adalah seperti berikut (cuba ganti ID)
$data['entity']['payments'][0]['state']['id'] = $logMessageId;
Kemudian saya cuba menyimpannya semula ke dalam pembolehubah modifiedJsonData dan menggantikannya semula ke dalam direktori.
$modifiedJsonData = json_encode($data, JSON_PRETTY_PRINT); file_put_contents($fil, $modifiedJsonData);
Nampaknya berfungsi sebahagian, tetapi tidak sepenuhnya, dan bukan hanya menggantikan (ID).
Seperti yang ditunjukkan di bawah:$data['entity']['payments'][0]['state']['id']
Ia menggantikan keseluruhan kandungan JSON, bukan hanya kandungan di atas, kandungan JSON hendaklah lebih daripada kandungan berikut:
{ "entity": { "payments": [ { "state": { "id": ##### } } ] } }
Tolong bantu, saya mungkin melakukan sesuatu yang salah
P粉7627302052023-09-10 15:55:36
Saya juga boleh memintasnya dengan:
$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
Apabila menyahkod JSON menggunakan json_decode(), pastikan anda mempunyai teks JSON yang betul dalam $jsonData dan gunakan dua bendera dalam senario semasa, bendera pertama sentiasa digunakan dan bendera kedua lebih spesifik:
Contoh:
$data = json_decode($jsonData, true, flags: JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
(Sejak PHP 8.0)
$data = json_decode($jsonData, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
(Sejak PHP 7.3)
JSON_THROW_ON_ERROR
Sebab mengapa saya hanya melihat JSON $data['entity']['payments'][0]['state']['id']
adalah kerana $data = json_decode Operasi (...)
mengembalikan null
kerana penghuraian gagal. Menggunakan $data['entity']['payments'][0]['state']['id']
的JSON,是因为$data = json_decode(...)
操作返回了null
,因为解析失败。使用JSON_THROW_ON_ERROR
akan menukar sebarang ralat kepada pengecualian, yang lebih mudah dikesan kerana ia akan menghentikan pelaksanaan skrip apabila ralat.
Ini mengelakkan daripada mencari ralat dalam output seterusnya.
JSON_BIGINT_AS_STRING
BIGINT merujuk kepada BigInt (ECMA 262), iaitu jenis nilai berangka dalam JavaScript untuk integer yang sangat besar (negatif dan positif), yang json_decode() mungkin kehilangan ketepatan semasa memproses (3v4l.org demo ) :
var_dump(json_decode('4599999999999999999999999999999999'));
var_dump(json_decode('4599999999999999999999999999999999', true, 512, JSON_BIGINT_AS_STRING));
float(4.6E+33) string(34) "4599999999999999999999999999999999"