msgpack-php icon indicating copy to clipboard operation
msgpack-php copied to clipboard

force msgpack_pack treat empty array as a map

Open zhangbiao2009 opened this issue 10 years ago • 4 comments

Hello, when use msgpack_pack() to pack an empty array, it is always treated as an array, but sometimes we want it to be treated as an empty map, just like what JSON_FORCE_OBJECT does for json_encode(). Does msgpack_pack() has options like this?

Thanks you.

zhangbiao2009 avatar Apr 02 '15 04:04 zhangbiao2009

I have a similar issue. While implementing a client for 3d party binary protocol which utilizes msgpack, I run into a problem that I need to send php indexed array as MP map, but msgpack_pack() serializes such arrays to MP array. So it would be nice to have a possibility to specify a type of the data to be serialized, e.g.:

msgpack_pack([0 => 'foo', 1 => 'bar'], MessagePack::MAP);
// or
msgpack_pack_map([0 => 'foo', 1 => 'bar']);

rybakit avatar Apr 10 '15 07:04 rybakit

Hello, will this feature be supported in future? thanks!

zhangbiao2009 avatar Jul 27 '15 07:07 zhangbiao2009

Hi @zhangbiao2009 !

Let me check the other msgpack implementations, this may be out of scope. I get this is really useful, but you can just walk the returned structure and transform as needed. I just don't want to add needless complexity.

thanks for taking time to file this!

Sean-Der avatar Jul 28 '15 06:07 Sean-Der

For the record, in PDOStatement::bindValue() one can pass an optional 3d parameter with explicit data type, e.g.:

$stmt->bindValue(':foo', $foo, PDO::PARAM_INT);

So, for msgpack_pack() it may look like:

msgpack_pack([1, 2]); // will pack it to MP_ARRAY
msgpack_pack([1, 2], Msgpack::TYPE_MAP);
msgpack_pack([1, 2], Msgpack::TYPE_ARR);

msgpack_pack('42'); // will pack it to MP_STR
msgpack_pack('42', Msgpack::TYPE_INT);

msgpack_pack('2.4'); // will pack it to MP_STR
msgpack_pack('2.4', Msgpack::TYPE_FLOAT);

rybakit avatar Feb 24 '16 16:02 rybakit