Api.malformed_request_body error when using api to update individual firewall rule

My problem almost same as

But for some reason , I still having issues.
$apiurl = “https://api.cloudflare.com/client/v4/zones/6d30516b1d92f74a066d9215a6825ed7/firewall/rules/63ea5f47ef2c4a7b92ac499e0566ce7d”;

$filter    = array(
    	           'id'=>'8b2251ad136f4c9fbd75484c369d963a',
    	           "expression"=> "http.request.uri ne 'fake' ",
            	   'paused'=>false
              	);

$data      = array('id'=>'63ea5f47ef2c4a7b92ac499e0566ce7d',
		       'paused'=>true,
    	           'filter'=>$filter,
    	            'action'=>"",
            	   'description'=>'This is a  rule created by API4'
              	);

$postdata = json_encode($data);

curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httphead);

// We setup a http POST, and provide %postdata
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

i have validate

{“id”:“63ea5f47ef2c4a7b92ac499e0566ce7d”,“paused”:true,“filter”:{“id”:“8b2251ad136f4c9fbd75484c369d963a”,“expression”:“http.request.uri ne ‘fake’ “,“paused”:false},“action”:””,“description”:“This is a rule created by API4”}

is a valid json