3

I have an array of 10 objects that I am trying to convert to JSON. The array is being stored in a variable called $invoices. Below is the ouput of var_dump($invoices) shorted to only the first object.

I've tried the following:

$invoices = json_encode($invoices, FALSE);
$invoices = json_encode($invoices, TRUE);
$invoices = json_encode($invoices, JSON_UNESCAPED_UNICODE);

However, the output is always:

string(31) "[{},{},{},{},{},{},{},{},{},{}]"

How can this array be properly converted to JSON?

Note: I am running PHP 5.5.9

Update:

It turns out the problem is due the fact that json_encode won't work with "protected member variables." Is there a way to declare those variables as public if I don't have access to the class that created them?

array(10) {
  [0]=>
  object(QuickBooks_IPP_Object_Invoice)#285 (1) {
    ["_data":protected]=>
    array(22) {
      ["Id"]=>
      array(1) {
        [0]=>
        string(6) "{-224}"
      }
      ["SyncToken"]=>
      array(1) {
        [0]=>
        string(1) "0"
      }
      ["MetaData"]=>
      array(1) {
        [0]=>
        object(QuickBooks_IPP_Object_MetaData)#282 (1) {
          ["_data":protected]=>
          array(2) {
            ["CreateTime"]=>
            array(1) {
              [0]=>
              string(25) "2014-12-07T09:48:47-08:00"
            }
            ["LastUpdatedTime"]=>
            array(1) {
              [0]=>
              string(25) "2014-12-07T09:48:47-08:00"
            }
          }
        }
      }
      ["CustomField"]=>
      array(1) {
        [0]=>
        object(QuickBooks_IPP_Object_CustomField)#292 (1) {
          ["_data":protected]=>
          array(3) {
            ["DefinitionId"]=>
            array(1) {
              [0]=>
              string(4) "{-1}"
            }
            ["Name"]=>
            array(1) {
              [0]=>
              string(6) "Crew #"
            }
            ["Type"]=>
            array(1) {
              [0]=>
              string(10) "StringType"
            }
          }
        }
      }
      ["DocNumber"]=>
      array(1) {
        [0]=>
        string(4) "1038"
      }
      ["TxnDate"]=>
      array(1) {
        [0]=>
        string(10) "2014-12-07"
      }
      ["Line"]=>
      array(2) {
        [0]=>
        object(QuickBooks_IPP_Object_Line)#263 (1) {
          ["_data":protected]=>
          array(5) {
            ["Id"]=>
            array(1) {
              [0]=>
              string(4) "{-1}"
            }
            ["LineNum"]=>
            array(1) {
              [0]=>
              string(1) "1"
            }
            ["Amount"]=>
            array(1) {
              [0]=>
              string(9) "155555.00"
            }
            ["DetailType"]=>
            array(1) {
              [0]=>
              string(19) "SalesItemLineDetail"
            }
            ["SalesItemLineDetail"]=>
            array(1) {
              [0]=>
              object(QuickBooks_IPP_Object_SalesItemLineDetail)#765 (1) {
                ["_data":protected]=>
                array(2) {
                  ["ItemRef"]=>
                  array(1) {
                    [0]=>
                    string(4) "{-3}"
                  }
                  ["TaxCodeRef"]=>
                  array(1) {
                    [0]=>
                    string(6) "{-NON}"
                  }
                }
              }
            }
          }
        }
        [1]=>
        object(QuickBooks_IPP_Object_Line)#748 (1) {
          ["_data":protected]=>
          array(3) {
            ["Amount"]=>
            array(1) {
              [0]=>
              string(9) "155555.00"
            }
            ["DetailType"]=>
            array(1) {
              [0]=>
              string(18) "SubTotalLineDetail"
            }
            ["SubTotalLineDetail"]=>
            array(1) {
              [0]=>
              string(0) ""
            }
          }
        }
      }
      ["TxnTaxDetail"]=>
      array(1) {
        [0]=>
        object(QuickBooks_IPP_Object_TxnTaxDetail)#287 (1) {
          ["_data":protected]=>
          array(1) {
            ["TotalTax"]=>
            array(1) {
              [0]=>
              string(1) "0"
            }
          }
        }
      }
      ["CustomerRef"]=>
      array(1) {
        [0]=>
        string(5) "{-11}"
      }
      ["BillAddr"]=>
      array(1) {
        [0]=>
        object(QuickBooks_IPP_Object_BillAddr)#284 (1) {
          ["_data":protected]=>
          array(7) {
            ["Id"]=>
            array(1) {
              [0]=>
              string(5) "{-11}"
            }
            ["Line1"]=>
            array(1) {
              [0]=>
              string(13) "1045 Main St."
            }
            ["City"]=>
            array(1) {
              [0]=>
              string(13) "Half Moon Bay"
            }
            ["CountrySubDivisionCode"]=>
            array(1) {
              [0]=>
              string(2) "CA"
            }
            ["PostalCode"]=>
            array(1) {
              [0]=>
              string(5) "94213"
            }
            ["Lat"]=>
            array(1) {
              [0]=>
              string(10) "37.4559621"
            }
            ["Long"]=>
            array(1) {
              [0]=>
              string(11) "-122.429939"
            }
          }
        }
      }
      ["ShipAddr"]=>
      array(1) {
        [0]=>
        object(QuickBooks_IPP_Object_ShipAddr)#814 (1) {
          ["_data":protected]=>
          array(7) {
            ["Id"]=>
            array(1) {
              [0]=>
              string(5) "{-11}"
            }
            ["Line1"]=>
            array(1) {
              [0]=>
              string(13) "1045 Main St."
            }
            ["City"]=>
            array(1) {
              [0]=>
              string(13) "Half Moon Bay"
            }
            ["CountrySubDivisionCode"]=>
            array(1) {
              [0]=>
              string(2) "CA"
            }
            ["PostalCode"]=>
            array(1) {
              [0]=>
              string(5) "94213"
            }
            ["Lat"]=>
            array(1) {
              [0]=>
              string(10) "37.4559621"
            }
            ["Long"]=>
            array(1) {
              [0]=>
              string(11) "-122.429939"
            }
          }
        }
      }
      ["DueDate"]=>
      array(1) {
        [0]=>
        string(10) "2015-01-06"
      }
      ["TotalAmt"]=>
      array(1) {
        [0]=>
        string(9) "155555.00"
      }
      ["ApplyTaxAfterDiscount"]=>
      array(1) {
        [0]=>
        string(5) "false"
      }
      ["PrintStatus"]=>
      array(1) {
        [0]=>
        string(11) "NeedToPrint"
      }
      ["EmailStatus"]=>
      array(1) {
        [0]=>
        string(6) "NotSet"
      }
      ["Balance"]=>
      array(1) {
        [0]=>
        string(9) "155555.00"
      }
      ["Deposit"]=>
      array(1) {
        [0]=>
        string(1) "0"
      }
      ["AllowIPNPayment"]=>
      array(1) {
        [0]=>
        string(5) "false"
      }
      ["AllowOnlinePayment"]=>
      array(1) {
        [0]=>
        string(5) "false"
      }
      ["AllowOnlineCreditCardPayment"]=>
      array(1) {
        [0]=>
        string(5) "false"
      }
      ["AllowOnlineACHPayment"]=>
      array(1) {
        [0]=>
        string(5) "false"
      }
    }
  }
  [1]=>
  object(QuickBooks_IPP_Object_Invoice)#830 (1) {
    ["_data":protected]=>
    array(22) {
    ...
    ...
Raphael Rafatpanah
  • 19,082
  • 25
  • 92
  • 158
  • You should start by saying that you're trying to use QuickBooks API. Intuit requires you to authenticate to QuickBooks Online (just once) via OAuth. Intuit requires you to register an "app" to connect to QuickBooks Online. – carlodurso Dec 08 '14 at 02:56
  • @carlodurso, yes I'm using the QBO API. My app is registered and connected, which is how I got this data. However, the question remains. How can this array be converted to JSON? I believe the problem is a result of the protected member variables. – Raphael Rafatpanah Dec 08 '14 at 03:00
  • Are you able to implement [JsonSerializable](http://php.net/manual/en/jsonserializable.jsonserialize.php)? If not you may retrieve the values via reflection. – Rangad Dec 08 '14 at 03:03
  • Have you tried `$Invoice->getLine(0);` to check if it returns any value? – carlodurso Dec 08 '14 at 03:05
  • @carlodurso, $invoice is an array, not an object. Also, the array posted above is the result of var_dump($invoice). – Raphael Rafatpanah Dec 08 '14 at 03:12
  • @Rangad, will that work with protected member variables? – Raphael Rafatpanah Dec 08 '14 at 03:13
  • If the class doesn't use some awkard abuse of magical `__get` it should. – Rangad Dec 08 '14 at 03:15

4 Answers4

2

The best way is to implement JsonSerializable class and define the jsonSerialize() function

Example:

class MyObj implements JsonSerializable{
    protected $id;
    protected $name;

    function getId() { return $this->$id; }
    function getName() { return $this->$name; }
  
     public function jsonSerialize() {
                return [
                'Id' => $this->getId(),
                'Name' => $this->getName()
            ];
        }
}

// $arrofobj is array of objects of type MyObj 
json_encode($arrofobj);  //this will convert array of objects to JSON
1

If these classes cannot implement JsonSerializable you may access the protected properties using Reflection.

Example:

class Publisher {
    protected $name;
    protected $id;
    public function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

function getPublisherExportData($publishers) {
    $out = [];
    foreach($publishers as $publisher) {
        $currentPData = [];
        $refl = new ReflectionClass($publisher);
        $props = $refl->getProperties(ReflectionProperty::IS_PROTECTED);
        foreach($props as $prop) {
            $prop->setAccessible(true);
            $currentPData[$prop->getName()] = $prop->getValue($publisher);
        }
        $out[] = $currentPData;
    }

    return $out;
}

var_dump(json_encode(getPublisherExportData([new Publisher(12, 'My Name'), new Publisher(15, 'NameProperty')]), JSON_PRETTY_PRINT));

Will result in:

string(121) "[ { "name": "My Name", "id": 12 }, { "name": "NameProperty", "id": 15 } ]"

However, you will need to handle object graphs and conditional exports yourself. Depending on the required json output you might think about replacing $out with an instance of stdClass and write using the $out->{$prop->getName()} = $val syntax to it.

If you are able to use your custom implementations you could add a method using get_object_vars($this) to avoid most of the code above, however if you could do that you should consider implementing JsonSerializable which is meant for that task.

Rangad
  • 2,110
  • 23
  • 29
0

you need write a function for your class "QuickBooks_IPP_Object_MetaData' and get a array. you may would see this question, Serializing PHP object to JSON

Community
  • 1
  • 1
Lynn
  • 111
  • 1
  • 4
0

In the end, this is the solution I chose to use:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}

From here: How do I convert an object to an array?

With a multidimensional array (and not an array of objects containing protected variables), json_encode() works great.

Community
  • 1
  • 1
Raphael Rafatpanah
  • 19,082
  • 25
  • 92
  • 158