Использование json_encode для объектов в PHP (независимо от области видимости)

Я пытаюсь вывести списки объектов в формате json и хотел бы знать, есть ли способ сделать объекты пригодными для использования в json_encode ? Код, который я получил, выглядит примерно так

$related = $user->getRelatedUsers();
echo json_encode($related);

Сейчас я просто перебираю массив пользователей и по отдельности экспортирую их в массивы для json_encode, чтобы превратить в пригодный для использования json для меня. Я уже пытался сделать объекты итеративными, но json_encode, похоже, все равно их пропускает.

edit : вот var_dump ();

php > var_dump($a);
object(RedBean_OODBBean)#14 (2) {
  ["properties":"RedBean_OODBBean":private]=>
  array(11) {
    ["id"]=>
    string(5) "17972"
    ["pk_UniversalID"]=>
    string(5) "18830"
    ["UniversalIdentity"]=>
    string(1) "1"
    ["UniversalUserName"]=>
    string(9) "showforce"
    ["UniversalPassword"]=>
    string(32) ""
    ["UniversalDomain"]=>
    string(1) "0"
    ["UniversalCrunchBase"]=>
    string(1) "0"
    ["isApproved"]=>
    string(1) "0"
    ["accountHash"]=>
    string(32) ""
    ["CurrentEvent"]=>
    string(4) "1204"
    ["userType"]=>
    string(7) "company"
  }
  ["__info":"RedBean_OODBBean":private]=>
  array(4) {
    ["type"]=>
    string(4) "user"
    ["sys"]=>
    array(1) {
      ["idfield"]=>
      string(2) "id"
    }
    ["tainted"]=>
    bool(false)
    ["model"]=>
    object(Model_User)#16 (1) {
      ["bean":protected]=>
      *RECURSION*
    }
  }
}

и вот что дает мне json_encode:

php > echo json_encode($a);
{}

Я закончил с этим:

    function json_encode_objs($item){   
        if(!is_array($item) && !is_object($item)){   
            return json_encode($item);   
        }else{   
            $pieces = array();   
            foreach($item as $k=>$v){   
                $pieces[] = "\"$k\":".json_encode_objs($v);   
            }   
            return '{'.implode(',',$pieces).'}';   
        }   
    }   

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

68 голосов | спросил A. Rager 15 Jam1000000amSat, 15 Jan 2011 05:46:31 +030011 2011, 05:46:31

9 ответов


0

В RedBeanPHP 2.0 есть функция массового экспорта, которая превращает всю коллекцию бинов в массивы. Это работает с кодировщиком JSON.

json_encode( R::exportAll( $beans ) );
ответил Gabor de Mooij 20 Mayam11 2011, 11:32:01
0

Все свойства вашего объекта являются частными. ака ... недоступно за пределами их класса.

Решение для PHP <5,4

Если вы хотите сериализовать свойства своего закрытого и защищенного объекта, вам нужно реализовать функцию кодирования JSON внутри вашего класса, которая использует json_encode() в структуре данных, которую вы создаете для этой цели.

class Thing {
    ...
    public function to_json() {
        return json_encode(array(
            'something' => $this->something,
            'protected_something' => $this->get_protected_something(),
            'private_something' => $this->get_private_something()                
        ));
    }
    ...
}

Решение для PHP> = 5.4

Используйте новый интерфейс JsonSerializable, чтобы предоставить собственное представление json для использования json_encode

class Thing implements JsonSerializable {
    ...
    public function jsonSerialize() {
        return [
            'something' => $this->something,
            'protected_something' => $this->get_protected_something(),
            'private_something' => $this->get_private_something()
        ];
    }
    ...
}

Более подробная рецензия

ответил jondavidjohn 15 Jam1000000amSat, 15 Jan 2011 05:50:29 +030011 2011, 05:50:29
0

В PHP> = 5.4.0 появился новый интерфейс для сериализации объектов в JSON: JsonSerializable

Просто внедрите интерфейс в свой объект и определите метод JsonSerializable, который будет вызываться при использовании json_encode

Таким образом, решение для PHP> = 5.4.0 должно выглядеть примерно так:

class JsonObject implements JsonSerializable
{
    // properties

    // function called when encoded with json_encode
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}
ответил ilanco 8 Maypm12 2012, 19:02:39
0

У меня работает следующий код:

public function jsonSerialize()
{
    return get_object_vars($this);
}
ответил user2944142 31 MarpmMon, 31 Mar 2014 16:55:09 +04002014-03-31T16:55:09+04:0004 2014, 16:55:09
0

Я еще не видел упомянутого, но в bean-компонентах есть встроенный метод getProperties().

Итак, чтобы использовать его:

// What bean do we want to get?
$type = 'book';
$id = 13;

// Load the bean
$post = R::load($type,$id);

// Get the properties
$props = $post->getProperties();

// Print the JSON-encoded value
print json_encode($props);

Это выводит:

{
    "id": "13",
    "title": "Oliver Twist",
    "author": "Charles Dickens"
}

Теперь сделайте шаг вперед. Если у нас есть массив бобов ...

// An array of beans (just an example)
$series = array($post,$post,$post);

... тогда мы могли бы сделать следующее:

  • Цикл по массиву с циклом foreach.

  • Замените каждый элемент (компонент) массивом свойств компонента.

Так что это ...

foreach ($series as &$val) {
  $val = $val->getProperties();
}

print json_encode($series);

... выводит это:

[
    {
        "id": "13",
        "title": "Oliver Twist",
        "author": "Charles Dickens"
    },
    {
        "id": "13",
        "title": "Oliver Twist",
        "author": "Charles Dickens"
    },
    {
        "id": "13",
        "title": "Oliver Twist",
        "author": "Charles Dickens"
    }
]

Надеюсь, это поможет!

ответил chrisfargen 30 J0000006Europe/Moscow 2013, 22:03:15
0

Я обычно включаю в свои объекты небольшую функцию, которая позволяет мне создавать дамп в массив, json или xml. Что-то вроде:

public function exportObj($method = 'a')
{
     if($method == 'j')
     {
         return json_encode(get_object_vars($this));
     }
     else
     {
         return get_object_vars($this);
     }
}

в любом случае get_object_vars(), вероятно, вам пригодится.

ответил Phoenix 15 Jam1000000amSat, 15 Jan 2011 06:15:24 +030011 2011, 06:15:24
0
$products=R::findAll('products');
$string = rtrim(implode(',', $products), ',');
echo $string;
ответил Asahajit 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 28 Sep 2015 22:13:18 +0300 2015, 22:13:18
0

Вот мой путь:

function xml2array($xml_data)
{
    $xml_to_array = [];

    if(isset($xml_data))
    {
        if(is_iterable($xml_data))
        {
            foreach($xml_data as $key => $value)
            {
                if(is_object($value))
                {
                    if(empty((array)$value))
                    {
                        $value = (string)$value;
                    }
                    else
                    {
                        $value = (array)$value;
                    }
                    $value = xml2array($value);
                }
                $xml_to_array[$key] = $value;
            }
        }
        else
        {
            $xml_to_array = $xml_data;
        }
    }

    return $xml_to_array;
}
ответил Andrei 15 AM00000040000003631 2018, 04:06:36
0

для массива объектов я использовал что-то вроде этого, следуя пользовательскому методу php <5,4:

$jsArray=array();

//transaction is an array of the class transaction
//which implements the method to_json

foreach($transactions as $tran)
{
    $jsArray[]=$tran->to_json();
}

echo json_encode($jsArray);
ответил Greg 27 MarpmThu, 27 Mar 2014 20:35:17 +04002014-03-27T20:35:17+04:0008 2014, 20:35:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132