2
votes

Calculer la taille en octets de la charge utile JSON en l'incluant dans la charge utile JSON en PHP

Je dois envoyer des données en utilisant JSON dans une structure comme celle-ci:

$joutput=json_encode($JSONDATA,JSON_NUMERIC_CHECK);
echo $joutput;

NOTE: la variable $ content est un tableau associatif dynamique, donc sa taille n'est pas constante. La sortie JSON est envoyée en utilisant le système classique:

$JSONDATA= 
    array(
        'response' => true, 
        'error' => null,
        'payload' => 
            array(
                'content' => $content,
                'size' => $size 
                )
        );

La question est: comment puis-je évaluer dynamiquement la variable $ size et l'inclure dans la sortie?


2 commentaires

Vous ne pouvez pas intégrer de manière fiable la taille d'une chaîne dans la chaîne en tant que chaîne car ces données changeront la longueur de la chaîne et la longueur de la chaîne changera ces données. Utilisez plutôt l'en-tête HTTP Content-Length: .


ce n'est pas si @Sammitch. Voir ma solution ci-dessous.


3 Réponses :


0
votes

Partie 1. Si cela ne fonctionne pas pour vous, je mettrai à jour la réponse après votre prochaine erreur.

$test_1 = memory_get_usage();
$content = array('key'=>'value');
$size = memory_get_usage() - $test_1;

$JSONDATA= 
    array(
        'response' => true, 
        'error' => null,
        'payload' => 
            array(
                'content' => $content,
                'size' => $size 
                )
        );


1 commentaires

Eh bien Giorgi, je vous remercie beaucoup pour votre réponse intéressante, je l'ai essayé et j'obtiens un résultat mais malheureusement les chiffres sont faux. En d'autres termes, si je mesure la sortie à l'aide de l'inspecteur Chrome, j'obtiens 664 caractères (ou octets), mais en utilisant votre méthode, je n'obtiens que 227 octets ... un indice?



2
votes

vous pouvez l'utiliser pour calculer la taille de $ content ( DEMO ) :

$size = mb_strlen(json_encode($content, JSON_NUMERIC_CHECK), '8bit');

Cela vous fournira toute la longueur de la chaîne json_encode () d de $ content . Si vous souhaitez calculer la taille en octets (si vous utilisez des caractères multi-octets), cela peut être plus utile ( DEMO ) :

$size = strlen(json_encode($content, JSON_NUMERIC_CHECK));


2 commentaires

Cela a bien fonctionné, @ mega6382! Voici ma solution: $ t = mb_strlen (json_encode ($ JSONDATA, JSON_NUMERIC_CHECK), '8bit'); $ JSONDATA ['payload'] ['size'] = $ t + strlen ($ t); Le résultat est parfait!


vient de mentionner votre excellente solution dans mon dernier message. Votre solution est maintenant acceptée!



0
votes

Je suppose que cela sera utile pour beaucoup d'autres, j'ai donc décidé de répondre à ma propre question en utilisant la solution @ mega6382:

// prepare the JSON array 
$JSONDATA= 
array(
    'response' => true, 
    'error' => null,
    'payload' => 
        array(
            'content' => $content,
            'size' => $size 
            )
    );
// evaluate the JSON output size WITHOUT accounting for the size string itself
$t = mb_strlen(json_encode($JSONDATA, JSON_NUMERIC_CHECK), '8bit');
// add the contribution of the size string and update the value
$JSONDATA['payload']['size']=$t+strlen($t);
// output the JSON data
$joutput=json_encode($JSONDATA,JSON_NUMERIC_CHECK);
echo $joutput;


0 commentaires