Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将空数组序列化和反序列化为字典/对象_C#_Php_Json_Json.net - Fatal编程技术网

C# 将空数组序列化和反序列化为字典/对象

C# 将空数组序列化和反序列化为字典/对象,c#,php,json,json.net,C#,Php,Json,Json.net,我正在开发一个Silverlight3应用程序,它必须与PHP5.2.13服务器应用程序通信。 我们正在用它来完成这项工作,但我在字典方面遇到了一些问题 我正在做一些实验,并尝试反序列化包含字典的对象: public Dictionary<string, Block> Table { get { return m_table; } set { m_table = value; } } 问题是空数组显然不被视为assoc数组,因此它们被导出为[],而不是{} 我曾想过向数组(

我正在开发一个Silverlight3应用程序,它必须与PHP5.2.13服务器应用程序通信。 我们正在用它来完成这项工作,但我在字典方面遇到了一些问题

我正在做一些实验,并尝试反序列化包含字典的对象:

public Dictionary<string, Block> Table
{
  get { return m_table; }
  set { m_table = value; }
}
问题是空数组显然不被视为assoc数组,因此它们被导出为
[]
,而不是
{}

我曾想过向数组(force assoc)中添加类似于
'null'=>null的内容,然后在客户端进行一些清理,但我无法控制客户端C#对象,也无法将它们约束为可为null,因此。。。我被这件事难住了;)

你知道有什么解决办法吗

感谢您的时间,非常感谢:)

编辑:澄清一下,我不能同时控制C#和PHP对象的结构。 在我的测试中,我创建了一个包含字典的对象,但是这个洞对象立即被编码。 这是一个过于简化的版本:

class Block
{
  public $X = 0;
  public $Y = 0;
  public $Name = '';
  public $Children = array();
  public $Table = array();
  public $Nested = null;
}
其中,
应为字典并编码为

echo json_encode( new Block() );

您可以使用
JSON\u FORCE\u对象
标志强制
[]
成为
{}
,如下所示:

$b = array();

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

[]
{}
请注意,如果未启用此选项,则仅使用对象表示法对关联数组进行编码

发件人:

编辑

根据,在编码前将数据强制转换为
对象将起作用:

$b = array();
json_encode((object)$b);
$block = new Block();

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

echo $json;
编辑

我解决这个问题的方法有点老套,但会奏效:

$b = array();
json_encode((object)$b);
$block = new Block();

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

echo $json;

这将在生成的JSON中搜索
[]
,并将其替换为
{}
。您必须注意的唯一问题是,例如,名称是否为
[]
。它将被更改为
{}
。您可以通过解析JSON并重新构建它来解决这个问题,当它不是字符串文本的一部分时,将
[]
替换为
{}
。但是,您可以假设
[]
永远不会是字符串文字的一部分。

我更喜欢simplecode的第二种方法,它在本例中有效

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

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


在PHP端,您使用的是内置的
json\u encode
函数还是其他库?好的,很好。查看我的答案-我认为它解决了您的问题:)编辑了我的问题,很抱歉之前没有澄清;)@SimpleCode不幸的是,它只在PHP5.3上可用(除非我犯了一个愚蠢的错误),但我尝试了,它抱怨有超过1个函数参数。谢谢:)问题是,数组已经包含在一个对象中,我无法控制它。让我编辑我的问题,但我对你的问题投了赞成票;)我发布了一个黑客解决方案。:)现在对于对象数组(我将其反序列化为列表)它失败了,但我可能必须设置类似“arrays as objects”的内容。。。如果你不介意的话,我会等一小会儿,等一个不那么黑客的解决方案,但我会把它标记为正确的,以防它不会发生。谢谢:)
现在对象数组失败了
-你能举个例子吗?谢谢:)我也在看这个,很棒的东西,呵呵