cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk menggantikan dan menyimpan kandungan utama JSON dalam Shopware 6.5 menggunakan PHP

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粉306523969P粉306523969448 hari yang lalu701

membalas semua(2)saya akan balas

  • P粉762730205

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

    balas
    0
  • P粉438918323

    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:

    1. JSON_THROW_ON_ERROR
    2. JSON_BIGINT_AS_STRING

    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"

    balas
    0
  • Batalbalas