Browse Source

Fixes #957: Json::encode() doesn't handle empty object correctly.

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
fceb2d6e21
  1. 34
      framework/yii/helpers/BaseJson.php
  2. 4
      tests/unit/framework/helpers/JsonTest.php

34
framework/yii/helpers/BaseJson.php

@ -81,32 +81,26 @@ class BaseJson
*/
protected static function processData($data, &$expressions, $expPrefix)
{
if (is_array($data)) {
foreach ($data as $key => $value) {
if (is_array($value) || is_object($value)) {
$data[$key] = static::processData($value, $expressions, $expPrefix);
}
}
return $data;
} elseif (is_object($data)) {
if (is_object($data)) {
if ($data instanceof JsExpression) {
$token = "!{[$expPrefix=" . count($expressions) . ']}!';
$expressions['"' . $token . '"'] = $data->expression;
return $token;
} else {
$data = $data instanceof Arrayable ? $data->toArray() : get_object_vars($data);
$result = array();
foreach ($data as $key => $value) {
if (is_array($value) || is_object($value)) {
$result[$key] = static::processData($value, $expressions, $expPrefix);
} else {
$result[$key] = $value;
}
}
$data = $data instanceof Arrayable ? $data->toArray() : get_object_vars($data);
if ($data === array() && !$data instanceof Arrayable) {
return new \stdClass();
}
}
if (is_array($data)) {
foreach ($data as $key => $value) {
if (is_array($value) || is_object($value)) {
$data[$key] = static::processData($value, $expressions, $expPrefix);
}
return $result;
}
} else {
return $data;
}
return $data;
}
}

4
tests/unit/framework/helpers/JsonTest.php

@ -45,6 +45,10 @@ class JsonTest extends TestCase
'b' => new JsExpression($expression2),
);
$this->assertSame("{\"a\":[1,$expression1],\"b\":$expression2}", Json::encode($data));
// https://github.com/yiisoft/yii2/issues/957
$data = (object)null;
$this->assertSame('{}', Json::encode($data));
}
public function testDecode()

Loading…
Cancel
Save