2010-12-02 18 views
4

PHP 5.2.13サーバーアプリケーションと通信するSilverlight 3アプリケーションを開発中です。 私たちはJSON.NETを使って仕事を終えていますが、私は辞書にいくつか問題があります。私はいくつかの実験を行うと、辞書を含むオブジェクトをデシリアライズしようとしている空の配列を辞書/オブジェクトにシリアライズして逆シリアル化する

:同等のオブジェクトをシリアル化するとき、

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

C#が適切にシリアライズし、私はそれに満足だけど、PHP側で空のTableがあると、動作しません。

$this->Table = array(); 

問題は、空の配列は、明らかに、連想配列とみなされていないので、それらは[]代わりに{}としてエクスポートされることです。

私は'null' => nullのようなものを配列に追加して(force assoc)、クライアントでいくつかのクリーンアップを行いましたが、クライアントのC#オブジェクトを制御していません。私はこの1つにこだわっている;)

あなたはどんな解決策を知っていますか?非常に高く評価お時間を

おかげで、:)

EDIT:明確にするために、私は両方とも、C#とPHPのオブジェクトの構造を制御することはできません。 私のテストでは、辞書を含むオブジェクトを作成しましたが、穴オブジェクトは一度にエンコードされます。 ここでのオーバー簡易版です:Tableはあなたがそうのように、{}になるために[]を強制的にJSON_FORCE_OBJECTフラグを使用することができます

echo json_encode(new Block()); 
+0

を作品simplecodeによって第二の方法を好む、あなたは組み込みの 'json_encode'機能、または他のいくつかのライブラリを使用していますか? –

+0

@SimpleCoder yes :) – DiogoNeves

+0

いいえ、良いです。 –

答えて

3

として辞書やエンコードする必要があり

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

$b = array(); 

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

出力:

[] 
{} 

を指定しない場合、連想配列のみがオブジェクト表記法を使用してエンコードされます。

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

EDIT this questionによると

、それが動作するエンコード前objectにデータをキャスト:

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

EDIT

私はこれを解決する方法が少しハックですが、それは動作します:

$block = new Block(); 

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

echo $json; 

これは[]のための結果のJSONを検索し、{}に置き換えます。たとえば、名前が[]の場合にのみ、これを認識する必要があります。それは{}に変更されます。これを回避するには、JSONを解析して再構築し、文字列リテラルの一部でない場合はを{}に置き換えます。しかし、[]は決して文字列リテラルの一部ではないという前提を作ることができるかもしれません。

+0

@SimpleCoder残念ながら、PHP 5.3でしか使用できませんが、私は試してみました。 1つ以上の関数パラメータを持つことについて不平を言った。ありがとう:) – DiogoNeves

+0

あなたはどのバージョンを使用していますか? –

+0

PHPの使用5.2.13 – DiogoNeves

1

私はこのケースではPHP側では

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

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

ありがとう:)私はまた、これを見ている、素晴らしいものhehe – DiogoNeves

関連する問題