SORU
26 Temmuz 2011, Salı


Seri hale getirilirken PHP JSON nesnesi

JsonSerializable Interface yeni rast geldim PHP nesneleri JSON için seri hakkında bilgi php.net ortalarda dolaşıyor. Sadecegerçi, ve 5.3 olarak koşuyorum.x ortamı.

Nasıl bir işlevsellik elde ettiPHP &; 5.4 . lt ?

Henüz JSON ile çok çalıştım, ama bir uygulama bir API katmanı destek olmaya çalışıyorum, ve veri damping nesne (aksi görünümü gönderilecekne güzel olurdu içine JSON.

Eğer doğrudan nesne seri hale getirmek için çalışırsanız, json_encode() halt nesnenin ne olduğunu bilmiyor sanırım çünkü boş bir JSON dize döndürür;. Ardışık bir diziye nesne azaltmak, ve sonra kodlamak gerekirbu?


Örnek

$data = new Mf_Data();
$data->foo->bar['hello'] = 'world';

echo json_encode($data)boş bir nesne oluşturur:

{}

var_dump($data)ancak, beklendiği gibi çalışır:

object(Mf_Data)#1 (5) {
  ["_values":"Mf_Data":private]=>
  array(0) {
  }
  ["_children":"Mf_Data":private]=>
  array(1) {
    [0]=>
    array(1) {
      ["foo"]=>
      object(Mf_Data)#2 (5) {
        ["_values":"Mf_Data":private]=>
        array(0) {
        }
        ["_children":"Mf_Data":private]=>
        array(1) {
          [0]=>
          array(1) {
            ["bar"]=>
            object(Mf_Data)#3 (5) {
              ["_values":"Mf_Data":private]=>
              array(1) {
                [0]=>
                array(1) {
                  ["hello"]=>
                  string(5) "world"
                }
              }
              ["_children":"Mf_Data":private]=>
              array(0) {
              }
              ["_parent":"Mf_Data":private]=>
              *RECURSION*
              ["_key":"Mf_Data":private]=>
              string(3) "bar"
              ["_index":"Mf_Data":private]=>
              int(0)
            }
          }
        }
        ["_parent":"Mf_Data":private]=>
        *RECURSION*
        ["_key":"Mf_Data":private]=>
        string(3) "foo"
        ["_index":"Mf_Data":private]=>
        int(0)
      }
    }
  }
  ["_parent":"Mf_Data":private]=>
  NULL
  ["_key":"Mf_Data":private]=>
  NULL
  ["_index":"Mf_Data":private]=>
  int(0)
}

Ek

1)

Bu Mf_Data sınıf için icat ettim toArray() işlevi:

public function toArray()
{
    $array = (array) $this;
    array_walk_recursive($array, function (&$property) {
        if ($property instanceof Mf_Data) {
            $property = $property->toArray();
        }
    });
    return $array;
}

Ancak Mf_Data nesneleri de kendi üst başvurusu beri (içerennesne, bu özyineleme ile başarısız olur. Ama ne zaman böyle bir çekicilik _parent referans kaldırmak çalışır.

2)

Sadece takip etmek, karmaşık bir ağaç düğüm dönüşüm için son işlev ile gittim nesne:

// class name - Mf_Data
// exlcuded properties - $_parent, $_index
public function toArray()
{
    $array = get_object_vars($this);
    unset($array['_parent'], $array['_index']);
    array_walk_recursive($array, function (&$property) {
        if (is_object($property) && method_exists($property, 'toArray')) {
            $property = $property->toArray();
        }
    });
    return $array;
}

3)

Yine, bir bit bir uygulama temizleyici ile takip ediyorum. instanceof kontrolü için arabirim kullanarak method_exists() daha temiz görünüyor (ancak method_exists() yaptığı çapraz kesim miras/uygulama).

unset() kullanarak biraz dağınık çok kötü görünüyordu ve mantık başka bir yönteme refactored olmalıdır gibi görünüyor. Ancak, bu uygulamayoközellik dizisi kopyala (array_diff_key nedeniylebir şey düşünün.

interface ToMapInterface
{

    function toMap();

    function getToMapProperties();

}

class Node implements ToMapInterface
{

    private $index;
    private $parent;
    private $values = array();

    public function toMap()
    {
        $array = $this->getToMapProperties();
        array_walk_recursive($array, function (&$value) {
            if ($value instanceof ToMapInterface) {
                $value = $value->toMap();
            }
        });
        return $array;
    }

    public function getToMapProperties()
    {
        return array_diff_key(get_object_vars($this), array_flip(array(
            'index', 'parent'
        )));
    }

}

CEVAP
26 Temmuz 2011, Salı


En basit durumlarda tür ipucu olmalı

$json = json_encode( (array)$object );

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009
  • Tina Chen

    Tina Chen

    26 Mayıs 2012
  • VOICE TV

    VOICE TV

    2 Aralık 2010