80

オブジェクトのリストを json として出力しようとしていますが、オブジェクトを使用できるようにする方法があるかどうか知りたいjson_encodeですか? 私が持っているコードは次のようになります

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

現在、ユーザーの配列を繰り返し処理し、それらを個別に配列にエクスポートして、json_encode使用可能なjsonに変換しています。私はすでにオブジェクトを反復可能にしようとしましたが、json_encodeとにかくそれらをスキップしているようです。

編集: これが 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 が検出できることを望んでいました。

4

9 に答える 9

161

オブジェクトのすべてのプロパティは非公開です。別名...クラスのスコープ外では使用できません。

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()
        ];
    }
    ...
}

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()                
        ));
    }
    ...
}

詳しい書き込み

于 2011-01-15T02:50:29.740 に答える
47

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);
    }
}
于 2012-05-08T15:02:39.020 に答える
8

RedBeanPHP 2.0 には、Bean のコレクション全体を配列に変換する一括エクスポート機能があります。これは JSON エンコーダーで動作します。

json_encode( R::exportAll( $beans ) );
于 2011-05-20T07:32:01.757 に答える
4

次のコードは私のために働いた:

public function jsonSerialize()
{
    return get_object_vars($this);
}
于 2014-03-31T12:55:09.890 に答える
2

これについてはまだ触れていませんが、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ループします。

  • 各要素 (Bean) を Bean のプロパティの配列に置き換えます。

したがって、この...

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"
    }
]

お役に立てれば!

于 2013-06-30T18:03:15.110 に答える
1

私は通常、オブジェクトに小さな関数を含めて、配列、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()にせよ、おそらくあなたにとって役に立ちます。

于 2011-01-15T03:15:24.453 に答える
0
$products=R::findAll('products');
$string = rtrim(implode(',', $products), ',');
echo $string;
于 2015-09-28T19:13:18.807 に答える
-1

オブジェクトの配列の場合、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);
于 2014-03-27T16:35:17.327 に答える