Package: pyon-lib
PyonIntroductionPyon(Pythonic JSON) is a Python library which allows you toeasily convert native objects into JSON objects.It also supportsfilesystem-like path-structure,
which allows you to easily construct you JSON objects just the way you like it.Additionally, it uses recursion in order to alsoconvert every connected objectinto a usable form.PrerequisitesPython >= 3.2InstallationThe installation via pip is as easy as typingpipinstallpyon-libIf you want to install the newest version manually, you can also do this:gitclonehttps://github.com/lagmoellertim/pyon.gitcdpyon

python3setup.pyinstallBuildgitclonehttps://github.com/lagmoellertim/pyon.gitcdpyon

python3setup.pysdistbdist_wheelUsageImport PyonfrompyonimportPyonObjectCreate a basic ObjectclassTest(PyonObject):def__init__(self):self.var1="Variable 1"self.var2=5.5Convert an object into JSONtest=Test()json=test.dump()And this is the output:{'var1':'Variable 1','var2':5.5}Write the JSON object to a filetest=Test()json=test.generate_json(file_object=open("test.json","w+"))Hide certain variablesLet's say your Test-Class only needs the variable var2 for it's own calculation, but you don't want it to
end up in your final JSON object. You can avoid this by adding the prefix "_"classTest(PyonObject):def__init__(self):self.var1="Variable 1"self._var2=5.5test=Test()json=test.dump()And this is the output:{'var1':'Variable 1'}Use multiple objects / classesAs an example, I use the concept of a store with productsclassStore(PyonObject):def__init__(self,store_name):self.store_name=store_nameself.products=[Product(0,"Smartphone"),Product(1,"Laptop")]classProduct(PyonObject):def__init__(self,article_id,name):self.article_id=article_idself.name=namestore=Store("Generic Store")json=store.dump()And this is the output:{'store_name':'Generic Store','products':[{'article_id':0,'name':'Smartphone'},{'article_id':1,'name':'Laptop'}]}Specifying object pathsThis time, the JSON structure should not be based on the class structure, but rather on the path string
that we supply.Path Strings are very similar to your filesystem paths. You can navigate inside the JSON object using
these Path Strings.Here are some example:path1="/store/"path2="/test/../store/./"# Identical to path1 since ../ means one layer up and ./ can be ignoredpath3="/store/products/*"#The star symbol tells pyon to create a list instead of a dict in this locationLet's modify our Store / Products Class in order for it to use custom pathsclassStore(PyonObject):def__init__(self,store_name):super().__init__("/stores/*")self.store_name=store_nameself.products=[Product(0,"Smartphone"),Product(1,"Laptop")]classProduct(PyonObject):def__init__(self,article_id,name):super().__init__("products/*")self.article_id=article_idself.name=namestore=Store("Generic Store")json=store.dump()And this is the output:{'stores':[{'store_name':'Generic Store','products':[{'article_id':0,'name':'Smartphone'},{'article_id':1,'name':'Laptop'}]}]}As you can see in the example above, relative paths are also possible as long as the object has a parent.Use object variables for the Path StringTo use object variables inside of you Path String, simply specify them in the String using brackets like
this: {var1}The value of {var1} is self.var1 , so you just leave the 'self.' away.classTest(PyonObject):def__init__(self):super().__init__("/test/{var1}-{_var2}/")self.var1="Variable 1"self._var2=5.5test=Test()json=test.dump()And this is the output:{'test':{'Variable 1-5.5':{'var1':'Variable 1'}}}Different dump methodsPyon supports different methods for dumping the PyonObject. You can use the normal python dictionary ('json'), 'xml' or
'yaml'.
Here are some usage examples:json=test.dump(output_format="json")# JSON is default, so you can also leave it emptyxml=test.dump(output_format="xml")yaml=test.dump(output_format="yaml")Allow OverwriteFinally, there is Overwrite Protection. Since Paths allow you to freely choose the location where the
object should end up, it is possible for them to overlap. To allow / stop overwriting, you can do this:json=test.dump(allow_overwrite=True)The default value for allow_overwrite is FalseDocumentationIf you get stuck at some point while trying to use the API, take a look the code. It is fully commented and well-labeled,
which should help you understand what's going on.ContributingIf you are missing a feature or have new idea, go for it! That is what open-source is for!AuthorTim-Luca Lagmöller(@lagmoellertim)DonateYou can also contribute bybuying me a coffee.LicenseMIT LicenseCopyright © 2019-present,Tim-Luca LagmöllerHave fun :tada: