Сериализация и десериализация пустых массивов в словарь / объект - PullRequest
4 голосов
/ 02 декабря 2010

Я работаю над приложением Silverlight 3, которое должно взаимодействовать с серверным приложением PHP 5.2.13. Мы используем JSON.NET для завершения работы, но у меня возникли некоторые проблемы со словарями.

Я провожу несколько экспериментов и пытаюсь десериализовать объект, содержащий словарь:

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

C # сериализуется правильно, и я доволен этим, но на стороне PHP, при сериализации эквивалентного объекта с пустым Table, он не будет работать.

$this->Table = array();

Проблема в том, что пустые массивы, очевидно, не считаются ассоциированным массивом, поэтому они экспортируются как [] вместо {}.

Я думал добавить что-то вроде 'null' => 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() );

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Вы можете использовать флаг 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

EDIT

Согласно этому вопросу приведение данных к object до кодирования будет работать:

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

EDIT

Я бы решил, что это немного глупо, но это будет работать:

$block = new Block();

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

echo $json;

Это ищет результирующий JSON для [] и заменяет его на {}. Единственная проблема с этим, о которой вы должны знать, это, например, если Name - []. Будет изменено на {}. Это можно обойти, проанализировав JSON и восстановив его, заменив [] на {}, когда он не является частью строкового литерала. Но вы можете предположить, что [] никогда не будет частью строкового литерала.

1 голос
/ 14 декабря 2010

Я предпочитаю 2-й метод по простому коду, который в этом случае работает

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

echo "Empty array output as array: " . json_encode($b) . "\n";
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...