【问题标题】:Serializng and deserializing empty arrays to Dictionary/object将空数组序列化和反序列化为字典/对象
【发布时间】:2010-12-02 00:29:08
【问题描述】:

我正在开发一个必须与 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' =&gt; null 之类的东西(强制关联),然后在客户端中进行一些清理,但我不控制客户端 C# 对象,我也不能将它们限制为可以为空。 ..我坚持这个;)

你知道有什么解决办法吗?

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

编辑:为了澄清,我无法控制 C# 和 PHP 对象的结构。 在我的测试中,我创建了一个包含字典的对象,但孔对象立即被编码。 这是它的一个过度简化的版本:

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

Table 应该是字典并编码为

echo json_encode( new Block() );

【问题讨论】:

  • 在 PHP 端,您使用的是内置的 json_encode 函数还是其他一些库?
  • 好的,很好。查看我的答案-我认为它可以解决您的问题:)
  • 编辑了我的问题,很抱歉之前没有澄清它;)

标签: c# php json json.net


【解决方案1】:

您可以使用JSON_FORCE_OBJECT 标志强制[] 变为{},如下所示:

$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

编辑

根据this question,在编码之前将数据转换为object 将起作用:

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

编辑

我解决这个问题的方法有点老套,但它会起作用:

$block = new Block();

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

echo $json;

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

【讨论】:

  • @SimpleCoder 不幸的是,它只在 PHP 5.3 上可用(除非我犯了一个愚蠢的错误),但我尝试过它抱怨有超过 1 个函数参数。谢谢:)
  • 问题是,数组已经包含在一个对象中,我无法控制。让我编辑我的问题,但我对你的问题投了赞成票;)
  • 我发布了一个骇人听闻的解决方案。 :)
  • 现在它对于对象数组(我反序列化为 List)失败,但我可能需要设置类似“数组作为对象”之类的东西......我要等一会儿如果您不介意的话,可以使用一个不那么骇人听闻的解决方案,但是我会将其标记为正确,以防万一。谢谢:)
  • Now it fails for arrays of objects - 你能举个例子吗?
【解决方案2】:

我更喜欢simplecode的第二种方法,在这种情况下有效

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

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

【讨论】:

  • 谢谢 :) 我也在看这个,好东西嘿嘿
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2014-10-24
相关资源
最近更新 更多