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. 26
      framework/yii/helpers/BaseJson.php
  2. 4
      tests/unit/framework/helpers/JsonTest.php

26
framework/yii/helpers/BaseJson.php

@ -81,32 +81,26 @@ class BaseJson
*/ */
protected static function processData($data, &$expressions, $expPrefix) protected static function processData($data, &$expressions, $expPrefix)
{ {
if (is_array($data)) { if (is_object($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 ($data instanceof JsExpression) { if ($data instanceof JsExpression) {
$token = "!{[$expPrefix=" . count($expressions) . ']}!'; $token = "!{[$expPrefix=" . count($expressions) . ']}!';
$expressions['"' . $token . '"'] = $data->expression; $expressions['"' . $token . '"'] = $data->expression;
return $token; return $token;
} else { }
$data = $data instanceof Arrayable ? $data->toArray() : get_object_vars($data); $data = $data instanceof Arrayable ? $data->toArray() : get_object_vars($data);
$result = array(); if ($data === array() && !$data instanceof Arrayable) {
return new \stdClass();
}
}
if (is_array($data)) {
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
if (is_array($value) || is_object($value)) { if (is_array($value) || is_object($value)) {
$result[$key] = static::processData($value, $expressions, $expPrefix); $data[$key] = static::processData($value, $expressions, $expPrefix);
} else {
$result[$key] = $value;
} }
} }
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), 'b' => new JsExpression($expression2),
); );
$this->assertSame("{\"a\":[1,$expression1],\"b\":$expression2}", Json::encode($data)); $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() public function testDecode()

Loading…
Cancel
Save