A bit more explanation about how we handle arbitrary metadata in the python code:

For each sample or observation, the minimum metadata is ```null``` in the BIOM file (i.e. ```"metadata": null```). If there is metadata, it can be any JSON object. There is currently no required metadata based on table type, and no validation is performed (this will change in the future).

Metadata is not required for all samples/observations if it is present. For example, ```sample1``` may not have any metadata (```"metadata": null```) while ```sample2``` may have some (```"metadata": {"foo": "bar"}```). This is perfectly acceptable.

We handle this on the python side by storing the metadata JSON object as a python dictionary with a default value of ```None```. Thus, if ```sample1``` doesn't have any metadata, this metadata dictionary is empty and will return ```None``` for any key. ```sample2``` will have a dictionary with the key ```"foo"``` and the value ```"bar"```. Of course, since the metadata can be pretty much anything, a key in this dictionary might point to a string, integer, list, another dictionary, etc.. We just let the JSON parser handle creating these data structures for us.

If there is no metadata for *all* samples (or observations), we store ```None``` instead of creating an empty dictionary.