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) {
    ...
    ...
7
  • 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. Commented Dec 8, 2014 at 2: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. Commented Dec 8, 2014 at 3:00
  • Are you able to implement JsonSerializable? If not you may retrieve the values via reflection. Commented Dec 8, 2014 at 3:03
  • Have you tried $Invoice->getLine(0); to check if it returns any value? Commented Dec 8, 2014 at 3:05
  • @carlodurso, $invoice is an array, not an object. Also, the array posted above is the result of var_dump($invoice). Commented Dec 8, 2014 at 3:12

4 Answers 4

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
Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

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

1 Comment

I think this may be my answer. Let me try to get it working and if I can solve my problem, I will mark your answer correct. Thank you.
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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.