Подтвердить что ты не робот

Strip null значения json объекта

Все мои запросы AJAX находятся в формате json, которые обрабатываются в javascript.

Как я могу предотвратить отображение нулевых значений на HTML-странице без необходимости писать if-statement в javascript для каждого значения json?

Или мне нужно написать собственную функцию PHP для кодирования массива json вместо использования json_encode(), чтобы он не отображал "null"?

4b9b3361

Ответ 1

На стороне сервера с PHP,

Вы можете использовать array_filter перед json_encode.

array_filter без второго аргумента удаляет нулевые элементы массива записей, например:

$object= array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => ''
          );

$object = (object) array_filter((array) $object);
$result = json_encode($object);

$result содержит:

{"0":"foo","2":-1}

Как вы видите, нулевые элементы удаляются.

Ответ 2

Я собираюсь добавить к принятому ответу, потому что это будет работать, только если у вас есть 1-мерный объект или массив. Если есть какой-либо массив или объект, то для того, чтобы заставить принятое решение работать, вы должны создать какой-то рекурсивный фильтр массива. Не идеально.

Лучшее решение, с которым я столкнулся с моим коллегой, состояло в том, чтобы фактически выполнить регулярное выражение в строке JSON до того, как оно было возвращено с сервера.

$json = json_encode($complexObject);
echo preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json);

Регулярное выражение удалит все места в строке формы ,"key":null, включая пробелы между ведущей запятой и началом ключа. После этого он также будет соответствовать "key":null,, чтобы убедиться, что в начале объекта JSON не было найдено нулевых значений.

Это не идеальное решение, но оно намного лучше, чем создание рекурсивного фильтра массива, если объект может иметь несколько измерений. Лучшее решение было бы, если бы json_encode имел флаг, который позволяет указать, хотите ли вы, чтобы нулевые записи оставались в выходной строке.

Ответ 3

Чтобы удалить только NULL, но сохраните FALSE, '' и 0:

function is_not_null($var)
{
    return !is_null($var);
}

echo json_encode(array_filter((array) $object, 'is_not_null'));

Ответ 4

public function __toString() {
    $obj = clone $this;
    $keys = get_object_vars($obj);
    foreach ($keys as $key => $value) {
        if (!$value) {
            unset($obj->{$key});
        }
    }
    return json_encode($obj);
}

Ответ 5

Как использовать собственный метод JSON.stringify на стороне javascript? Вы можете установить второй параметр - функцию для удаления ключей с нулевым значением. Если вы вернете undefined, свойство не будет включено в выходную строку JSON (проверьте документацию для параметра "replacer" на https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter).

function removeNulls(obj) {
    var str = JSON.stringify(obj, function(key, val) {
        if (val == null) return undefined;
        return val;
    });
    return JSON.parse(str);
}

Затем вы можете получить "нормализованный" объект JSON, вызвав:

var obj = removeNulls(obj);