2010-12-02 83 views
4

Je travaille sur une application Silverlight 3 qui doit communiquer avec une application serveur PHP 5.2.13. Nous utilisons JSON.NET pour terminer le travail, mais j'ai des problèmes avec les dictionnaires.Sérialisation et désérialisation de tableaux vides dans le dictionnaire/objet

Je fais des expériences et essayer de désérialiser un objet qui contient un dictionnaire:

public Dictionary<string, Block> Table 
{ 
    get { return m_table; } 
    set { m_table = value; } 
} 

C# sérialise correctement et je suis heureux avec elle, mais du côté de PHP, lors de la sérialisation d'un objet équivalent qui a un Table vide, cela ne fonctionnera pas.

$this->Table = array(); 

Le problème est que des tableaux vides, évidemment, ne sont pas considérés comme un tableau assoc et ils sont exportés sous forme [] au lieu de {}.

J'ai pensé à ajouter quelque chose comme 'null' => null au tableau (force assoc) et ensuite faire un peu de nettoyage dans le client, mais je ne contrôle pas les objets C# du client ni je peux les contraindre à être nulles donc .. Je suis bloqué sur celui-ci;)

Connaissez-vous une solution?

Merci pour votre temps, très apprécié :)

EDIT: Pour clarifier les choses, je ne peux pas contrôler la structure des deux, le C# et les objets PHP. Lors de mon test, j'ai créé un objet contenant un dictionnaire, mais l'objet trou est codé en une fois. Voici un rapport à la version simplifiée de celui-ci:

class Block 
{ 
    public $X = 0; 
    public $Y = 0; 
    public $Name = ''; 
    public $Children = array(); 
    public $Table = array(); 
    public $Nested = null; 
} 

Table doit être un dictionnaire et codé comme

echo json_encode(new Block()); 
+0

Du côté PHP, vous utilisez la fonction 'json_encode' intégrée ou d'une autre bibliothèque? –

+0

@SimpleCoder oui :) – DiogoNeves

+0

Ok, bien. Consultez ma réponse - Je pense que cela résout votre problème :) –

Répondre

3

Vous pouvez utiliser le drapeau JSON_FORCE_OBJECT pour forcer [] à devenir {}, comme ceci:

$b = array(); 

echo "Empty array output as array: " . json_encode($b) . "\n"; 
echo "Empty array output as object: " . json_encode($b, JSON_FORCE_OBJECT); 

La sortie:

[] 
{} 

Notez que sans cette option activée, seuls les tableaux associatifs sont codés à l'aide de la notation d'objet.

De:http://www.php.net/manual/en/function.json-encode.php

EDIT

Selon this question, jetant les données à un object avant de l'encoder fonctionnera:

$b = array(); 
json_encode((object)$b); 

EDIT

La façon dont je résoudre ce problème est un peu hackish, mais il fonctionnera:

$block = new Block(); 

$json = json_encode($block); 
$json = str_replace("[]", "{}", $json); 

echo $json; 

Cette requête JSON résultante pour [] et le remplace par {}. Le seul problème avec ceci que vous devez savoir est si, par exemple, le nom est []. Il sera changé en {}. Vous pouvez contourner cela en analysant le JSON et en le reconstruisant, en remplaçant [] par {} lorsqu'il ne fait pas partie d'un littéral de chaîne. Mais, vous pouvez faire l'hypothèse que [] ne fera jamais partie d'un littéral de chaîne.

+0

@SimpleCoder Malheureusement, il est seulement disponible sur PHP 5.3 (sauf si j'ai fait une erreur stupide) mais j'ai essayé et il se plaignait d'avoir plus d'un paramètre de fonction. Merci :) – DiogoNeves

+0

Quelle version utilisez-vous? –

+0

Utiliser PHP 5.2.13 – DiogoNeves

1

Je préfère la 2ème méthode par simplecode, qui fonctionne dans ce cas

<?php 
$b = array(
    "a" => array(), 
    "b" => (object)array() 
); 

echo "Empty array output as array: " . json_encode($b) . "\n"; 
?> 
+0

Merci :) Je regarde aussi ça, super truc hehe – DiogoNeves