Как сбросить объект json

То, что я пишу, это скрипт временного бана для людей, которые любят донимать мой сайт небольшими ботнетами.

Единственная проблема, с которой я столкнулся, это как отключить объект json.

У меня есть следующий код

/* JSON blocking script written by Michael Dibbets
 * Copyright 2012 by Michael Dibbets
 * http://www.facebook.com/michael.dibbets - mdibbets[at]outlook.com
 * Licenced under the MIT license http://opensource.org/licenses/MIT
 */
    // Turn on error reporting
    ini_set("display_errors", 1);
    error_reporting(E_ALL);  
    // Create our codeigniter filepath
    $filepath = FCPATH.'pagemodules/blocked.json';
    // Load file helper to be able to be lazy
    $this->load->helper('file');
    // Read the json file
    $data = read_file($filepath,'c+');
    // Have we succeeded? Then continue, otherwise fail graciously
    if($data !== false)
        {
            // Let's make it readable
        $json = json_decode($data);
            // Display it for debug purposes
        echo $data;
            // Iterate through every object, get the key to be able to unset it
        foreach($json as $key => $obj)
            {
                    // Dump the object for debug purposes
            var_dump($obj);
            echo "<P>";
                    // Has it's life time expired?
            if((int)$obj->{'endtime'} < strtotime("+2 hours 2 minutes"));
                {
                            // remove the object from the array
                unset($json[$key]);
                }
            }
            // Remove the file so we can overwrite it properly
        unlink($filepath); 
        }
    // Add some values to our array
    $json[] = array('ip' => $_SERVER['REMOTE_ADDR'],'endtime' => strtotime('+2 hours'));
    // Encode it
    $data = json_encode($json);
    // Write it to file
    write_file($filepath,$data,'c+'); 

Проблема, с которой я сталкиваюсь, заключается в том, что json encode кодирует его не как массив, а как объект. Проблема в том, что не работает следующее:

// This gives the error Fatal error: Cannot use object of type stdClass as array in /public_html/ocs_application/controllers/quick.php on line 37
unset($json[$key]);
// This doesn't report anything, and does nothing
unset($json->{$key});

Как сбросить объект json?


person Tschallacka    schedule 03.08.2012    source источник
comment
Дублировать? stackoverflow.com/questions/7044967/delete-from-json -using-php .... stackoverflow.com/questions/2901562/   -  person TigerTiger    schedule 03.08.2012
comment
Это то, что я пробовал. Но он закодирован как объект. Если вы будете следовать коду, вы увидите, что я начинаю все как массивы, но json_encode решает превратить его в строку объекта вместо строки массива.   -  person Tschallacka    schedule 03.08.2012


Ответы (2)


Чувак, когда вы используете json json_decode, передайте ему логическое значение true в качестве второго параметра.

таким образом вы избавитесь от кровавого stdClass.

Теперь, если вы хотите удалить объект json, в основном это строка, поэтому просто сделайте что-нибудь, ссылка $var = null;

если вы хотите отключить его часть, вам нужно сначала декодировать его, а затем кодировать.

$my_var = json_decode($json, true); // convert it to an array.

unset($my_var["key_of_value_to_delete"]);

$json = json_encode($my_var);

Всегда переходите к true в качестве второго параметра для json_decode, чтобы заставить его выполнять рекурсивное преобразование объекта json.

person thedethfox    schedule 03.08.2012
comment
Чувак, ты божественный! Большое спасибо. Это сделало мою жизнь намного проще! Должен был заметить это раньше, но застрял в колее. Большое спасибо! Вы преподали мне ценный урок о декодировании json. - person Tschallacka; 03.08.2012
comment
почему не задано изменение массива json объекта? мой json: [{proId: 3, sizeId: 1, число: 1}, {proId: 1, sizeId:, число: 10}, {proId: 3, sizeId: 1, число: 1}], но после сброса как это: {0:{proId:3,colorId:1,sizeId:1,номер:1},2:{proId:3,colorId:2,sizeId:1,номер:1}} - person farzad; 20.10.2017
comment
@farzad у меня та же проблема, кодировка не работает должным образом, она добавляет дополнительные числа в json. Массив ( [0] =› Массив ( [платформа] =› x [ссылка] =› x [videono] =› x ) [1] =› Array ( [platform] =› eders1 [link] =› 313389 [videono] =› 0 )) Этот массив возвращается к этому json {0:{platform:x,link:x,videono:x},1:{platform:eders1,link:313389,videono:0}} - person matasoy; 23.10.2020

Просто чтобы прояснить, что unset() работает как с объектами JSON, так и с массивами:

$json_str = '{"foo": 1, "bar": 2, "baz": 3}';
$json_obj = json_decode($json_str);
$json_arr = json_decode($json_str, true);

var_dump($json_obj); // object(stdClass)#1 (3) { ["foo"]=> int(1) ["bar"]=> int(2) ["baz"]=> int(3) }
var_dump($json_arr); // array(3) { ["foo"]=> int(1) ["bar"]=> int(2) ["baz"]=> int(3) }    

unset($json_obj->baz);
unset($json_arr['baz']);

var_dump($json_obj); // object(stdClass)#1 (2) { ["foo"]=> int(1) ["bar"]=> int(2) }
var_dump($json_arr); // array(2) { ["foo"]=> int(1) ["bar"]=> int(2) }

$key = 'bar';
unset($json_obj->$key);
unset($json_arr[$key]);

var_dump($json_obj); // object(stdClass)#1 (1) { ["foo"]=> int(1) }
var_dump($json_arr); // array(1) { ["foo"]=> int(1) }
person Paulo Freitas    schedule 03.08.2012
comment
Хорошо, а что делать, если вы не знаете имя объекта, который хотите отключить? Как в моем примере, если вы не используете истинную переменную в декодировании json? - person Tschallacka; 03.08.2012