Hướng dẫn php json_encode object private properties - thuộc tính riêng của đối tượng php json_encode

Tôi đang cố gắng mã hóa một số đối tượng trong PHP, nhưng tôi đang phải đối mặt với một vấn đề: Tôi muốn mã hóa dữ liệu được giữ bởi một thành viên tư nhân lớp. Tôi tìm thấy đoạn mã này để mã hóa đối tượng này bằng cách gọi hàm mã hóa như:

public function encodeJSON() 
{ 
    foreach ($this as $key => $value) 
    { 
        $json->$key = $value; 
    } 
    return json_encode($json); 
}

Tuy nhiên, điều này chỉ hoạt động nếu đối tượng tôi muốn mã hóa không chứa các đối tượng khác bên trong, đó là trường hợp. Làm thế nào tôi có thể làm để mã hóa không chỉ đối tượng "bên ngoài" mà còn mã hóa bất kỳ thành viên nào cũng là đối tượng?

Hỏi ngày 10 tháng 8 năm 2011 lúc 4:20Aug 10, 2011 at 4:20

Hướng dẫn php json_encode object private properties - thuộc tính riêng của đối tượng php json_encode

1

Phương pháp tốt nhất để tuần tự hóa một đối tượng có thuộc tính riêng là triển khai giao diện \ jsonserializable và sau đó thực hiện phương thức jsonserialize của riêng bạn để trả về dữ liệu bạn yêu cầu để được tuần tự hóa.

1 bây giờ sẽ tuần tự hóa đối tượng của bạn một cách chính xác.

Đã trả lời ngày 21 tháng 11 năm 2013 lúc 10:05Nov 21, 2013 at 10:05

samsamm777samsamm777samsamm777

1.6002 huy hiệu vàng13 Huy hiệu bạc14 Huy hiệu đồng2 gold badges13 silver badges14 bronze badges

0

Nếu bạn đang sử dụng Php 5.4, bạn có thể sử dụng giao diện jsonsonserializable: http://www.php.net/manual/en/class.jsonsonserializable.php

Bạn chỉ cần thực hiện một phương thức Jsonserialize trong lớp của bạn, trả về bất cứ điều gì bạn muốn được mã hóa.

Sau đó, khi bạn chuyển đối tượng của mình vào json_encode, nó sẽ mã hóa kết quả của jsonserialize.

Đã trả lời ngày 30 tháng 3 năm 2012 lúc 11:46Mar 30, 2012 at 11:46

Lucaslucaslucas

1.8602 huy hiệu vàng21 Huy hiệu bạc25 Huy hiệu đồng2 gold badges21 silver badges25 bronze badges

Dẫu sao thì. Bạn cần tạo phương thức công khai trong lớp của mình để trả về tất cả các trường của họ được mã hóa JSON

public function getJSONEncode() {
    return json_encode(get_object_vars($this));
}

Đã trả lời ngày 10 tháng 8 năm 2011 lúc 4:29Aug 10, 2011 at 4:29

OlegolegOleg

5681 Huy hiệu vàng5 Huy hiệu bạc18 Huy hiệu đồng1 gold badge5 silver badges18 bronze badges

2

Tôi nghĩ rằng @Petah có cách tiếp cận tốt nhất, nhưng theo cách đó bạn mất các thuộc tính là mảng hoặc đối tượng. Vì vậy, tôi đã thêm một chức năng làm điều đó một cách đệ quy:

function json_encode_private($object) {

    function extract_props($object) {
        $public = [];

        $reflection = new ReflectionClass(get_class($object));

        foreach ($reflection->getProperties() as $property) {
            $property->setAccessible(true);

            $value = $property->getValue($object);
            $name = $property->getName();

            if(is_array($value)) {
                $public[$name] = [];

                foreach ($value as $item) {
                    if (is_object($item)) {
                        $itemArray = extract_props($item);
                        $public[$name][] = $itemArray;
                    } else {
                        $public[$name][] = $item;
                    }
                }
            } else if(is_object($value)) {
                $public[$name] = extract_props($value);
            } else $public[$name] = $value;
        }

        return $public;
    }

    return json_encode(extract_props($object));
}

EDIT: Đã thêm is_Object () Kiểm tra bên trong vòng lặp mảng để tránh ngoại lệ get_class () trong cuộc gọi tiếp theo extract_props () khi các phần tử mảng không phải là đối tượng, như chuỗi hoặc số. Added is_object() check inside the array loop to avoid a get_class() exception in the next extract_props() call when the array elements are not objects, like strings or numbers.

Hướng dẫn php json_encode object private properties - thuộc tính riêng của đối tượng php json_encode

Sobakus

Phim huy hiệu bạc 181171 silver badge7 bronze badges

Đã trả lời ngày 11 tháng 1 năm 2015 lúc 14:03Jan 11, 2015 at 14:03

5

Tôi nghĩ rằng đây có thể là một trường hợp tuyệt vời cho việc sử dụng các đặc điểm

Sử dụng GUIST dưới đây, tôi đã triển khai giao diện Jsonsonserializable trong nhiều điểm của ứng dụng trong khi vẫn giữ được mã có thể quản lý được

https://gist.github.com/zburgermeiszter/7dc5e65b06bb34a325a0363726fd8e14

trait JsonSerializeTrait
{
    function jsonSerialize()
    {
        $reflect = new \ReflectionClass($this);
        $props   = $reflect->getProperties(\ReflectionProperty::IS_STATIC | \ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_PRIVATE);

        $propsIterator = function() use ($props) {
            foreach ($props as $prop) {
                yield $prop->getName() => $this->{$prop->getName()};
            }
        };

        return iterator_to_array($propsIterator());
    }
}

Sau đó, bạn chỉ cần làm

class YourClass implements JsonSerializable 
{
    use JsonSerializeTrait;

    ... normal encapsulated code...
}

Đã trả lời ngày 17 tháng 8 năm 2018 lúc 17:51Aug 17, 2018 at 17:51

Hướng dẫn php json_encode object private properties - thuộc tính riêng của đối tượng php json_encode

Jonathan Dsjonathan DSJonathan DS

1.9944 Huy hiệu vàng24 Huy hiệu bạc46 Huy hiệu đồng4 gold badges24 silver badges46 bronze badges

public function jsonSerialize()
{
    $objectArray = [];
    foreach($this as $key => $value) {
        $objectArray[$key] = $value;
    }

    return json_encode($objectArray);
}

Cá nhân tôi nghĩ rằng đây là một cách để làm điều đó. Nó tương tự như của Petah, ngoại trừ nó phù hợp với đóng gói tốt, bởi vì mảng được điền từ đối tượng.

Đặt chức năng này vào đối tượng của bạn hoặc như một đặc điểm được sử dụng bởi đối tượng của bạn. Để mỗi riêng của họ mặc dù.

Đã trả lời ngày 1 tháng 11 năm 2014 lúc 0:12Nov 1, 2014 at 0:12

YokeryokerYoker

4604 Huy hiệu bạc20 Huy hiệu Đồng4 silver badges20 bronze badges

1

Điều này sẽ in một JSON với tất cả các thuộc tính (công khai, riêng tư và được bảo vệ) của lớp

2:

$reflection = new ReflectionClass('Foo');
$properties = $reflection->getdefaultProperties();

echo json_encode($properties);

Nó sẽ hoạt động từ bất kỳ bối cảnh.

Đã trả lời ngày 10 tháng 2 năm 2013 lúc 10:10Feb 10, 2013 at 10:10

Hướng dẫn php json_encode object private properties - thuộc tính riêng của đối tượng php json_encode

Nghiêng Rusevemanuil RusevEmanuil Rusev

33,8K54 Huy hiệu vàng134 Huy hiệu bạc199 Huy hiệu đồng54 gold badges134 silver badges199 bronze badges

Sử dụng phản ánh Bạn có thể

1 thuộc tính riêng, mặc dù nó không được coi là thực tiễn tốt nhất:

function json_encode_private($object) {
    $public = [];
    $reflection = new ReflectionClass($object);
    foreach ($reflection->getProperties() as $property) {
        $property->setAccessible(true);
        $public[$property->getName()] = $property->getValue($object);
    }
    return json_encode($public);
}

E.g.

class Foo {
    public $a = 1;
    public $b = 2;
}
class Bar {
    private $c = 3;
    private $d = 4;
}

var_dump(json_encode(new Foo()));
var_dump(json_encode_private(new Bar()));

Outputs:

0

http://codepad.viper-7.com/nCcKYW

Đã trả lời ngày 27 tháng 11 năm 2013 lúc 20:07Nov 27, 2013 at 20:07

PetahpetahPetah

44,8K27 Huy hiệu vàng156 Huy hiệu bạc212 Huy hiệu đồng27 gold badges156 silver badges212 bronze badges

Bạn có thể JSON mã hóa một đối tượng trong PHP không?

Để mã hóa các đối tượng thành chuỗi được định dạng JSON trong PHP, bạn có thể sử dụng hàm json_encode (giá trị, tùy chọn, độ sâu).Tham số đầu tiên chỉ định đối tượng PHP để mã hóa.Bạn có thể kiểm soát cách đối tượng PHP sẽ được mã hóa thành JSON bằng cách chuyển kết hợp bitmasks trong tham số thứ hai.you can use the json_encode(value, options, depth) function. The first parameter specifies the PHP object to encode. You can control how the PHP object will be encoded into JSON by passing a combination of bitmasks in the second parameter.

JSON_ENCODE trở lại là gì?

Hàm json_encode () có thể trả về một chuỗi chứa biểu diễn JSON của giá trị được cung cấp.Mã hóa bị ảnh hưởng bởi các tùy chọn được cung cấp, và ngoài ra, việc mã hóa các giá trị phao phụ thuộc vào giá trị của serialize_precision.a string containing the JSON representation of supplied value. The encoding is affected by supplied options, and additionally, the encoding of float values depends on the value of serialize_precision.

JSON_ mã hóa trong PHP là gì?

json_encode (hỗn hợp $ value, int $ flags = 0, int $ depth = 512): chuỗi | false.Trả về một chuỗi chứa biểu diễn JSON của giá trị được cung cấp.Nếu tham số là một mảng hoặc đối tượng, nó sẽ được tuần tự hóa đệ quy.Returns a string containing the JSON representation of the supplied value . If the parameter is an array or object, it will be serialized recursively.

Jsonencode là gì?

Một đối tượng mã hóa các thể hiện của một loại dữ liệu dưới dạng đối tượng JSON..