Serialize Python2- and -3-Objects into a Fiware-Entity (NGSIv2) and back
Project description
FiwareObjectConverter (FOC)
This is a simple implementation to serialize Python2- and -3-Objects into a Fiware-Entity and back. The generated JSON-Strings can be POSTed to their API.
There is also the posibillity to ignore the Metadata while parsing back to the (specified) Python-Object.
For more Information about Fiwire-Orion visit the following website
Fiware Entity
Entity consits of
- Id
- Type
- has n Attributes:
- Name
- Type
- Value
has n-Metadata:
- Name
- Type
- Value
Usage
Let's create a class which contains a unicode-string in Python via:
class FooBar(object):
def __init__(self):
self.myStr = u'Hi!'
Object 2 FiwareEntity
This class can be simply serialized to Json with:
from objectFiwareConverter import ObjectFiwareConverter
json = ObjectFiwareConverter.obj2Fiware(FooBar(), ind=4)
# indent is set to 4 for readability
The str json contains the following
{
"myStr": {
"type": "string",
"value": "Hi!",
"metadata": {
"python": {
"type": "dataType",
"value": "unicode"
}
}
},
"type": "FooBar",
"id": "FooBarbc86c90d-6cca-41c3-878e-cbb58908056c"
}
This is a simple class for demonstration. The Data-Structure can be arbitrary complex.
The "type"- and "id"-values can be set manually. To do so, just add self.type = "YOUR_TYPE" and/or self.id = "YOUR_ID" to FooBar.
You also have the option to not set the id and value. Just do the following:
json = ObjectFiwareConverter.obj2Fiware(FooBar(), ind=4, showIdValue=False)
which would just create:
{
"myStr": {
"type": "string",
"value": "Hi!",
"metadata": {
"python": {
"type": "dataType",
"value": "unicode"
}
}
}
}
(E.g.: This json-string can be PATCHed to the v2-Api of the Context-Broker)
FiwareEntity 2 Object
A (Representation-) Class is needed to convert it back. Let's set a Class and then parse the JSON-Object into it:
class MyVeryOwnFooBar(object):
def __init__(self):
self.myStr = u' ' # Set Unicode DataType
mvofb = MyVeryOwnFooBar()
ObjectFiwareConverter.fiware2Obj(json, mvofb) # the json from above
print mvofb.myStr # prints "Hi!"
Missing variables which are defined by the JSON-String are ignored if not set in the class. If variables are defined which are not specified in the JSON-String then those variables are not touched.
Further Information
Fiware Entity Information (Type/ID)
type = ClassName
id = ClassName + Universally Unique Identifier (UUID)
The id consist of the Class-Name + a random generated uuid by uuid4() and the type is simply the Class-Name. Also: All Objects, which are converted back from json may contain an id and type Attribute. They can be accessed with getattr, if
Ignoring MetaData/Additional MetaData and excluding MetaDAta
To ignore the metadata, do the following:
mvofb = MyVeryOwnFooBar()
ObjectFiwareConverter.fiware2Obj(json, mvofb, useMetaData=False) # the json from above
The conversion between a Python-Object and a JSON-String is not bidirectional by ignoring the metadata.
By ignoring the metadata some Python-DataTypes are "converted into a simple type":
Complex, Tuple --> List
Unicode --> String
NOTE: Python3's strings are already unicode by default, so here nothing is changed. Additionally long-types no longer exists. Those are then set as int
NOTE:
The above example will throw an TypeError, because the class MyVeryOwnFooBar awaits an unicode but would be overwritten with a string, because the metadata is ignored. This behaviour can be turned off with the following:
mvofb = MyVeryOwnFooBar()
ObjectFiwareConverter.fiware2Obj(json, mvofb, useMetaData=False, ignoreWrongDataType=True) # the json from above
It is also possible to give a Data-Type-Object-Structure while converting to json. Simply create a dict containing the concrete Data-Type for Data and the additional Information will be added into the Metadata.
Example:
class AFooBar(object):
def __init__(self):
self.x = 32.123
self.y = 42.123
myData = dict(y='float32', x='float32')
json = ObjectFiwareConverter.obj2Fiware(AFooBar(), ind=4, dataTypeDict=myData)
wolud result to:
{
"y": {
"type": "number",
"value": 42.123,
"metadata": {
"python": {
"type": "dataType",
"value": "float"
},
"dataType": {
"type": "dataType",
"value": "float32"
}
}
},
"x": {
"type": "number",
"value": 32.123,
"metadata": {
"python": {
"type": "dataType",
"value": "float"
},
"dataType": {
"type": "dataType",
"value": "float32"
}
}
},
"type": "AFooBar",
"id": "AFooBar703e581d-3068-4b62-bfa3-c713707e6929"
}
To exclude the python-metadata, while creating the json. You can use ignorePythonMetaData=True as here:
json = ObjectFiwareConverter.obj2Fiware(FooBar(), ind=4, ignorePythonMetaData=True) # json fron above
This creates simply the following json:
{
"myStr": {
"type": "string",
"value": "Hi!"
},
"type": "FooBar",
"id": "FooBarbc86c90d-6cca-41c3-878e-cbb58908056c"
}
At last, if you simply cannot create a class which contains the needed values (or everything is dynamically), just use the setAttr- Parameter.
class SomeTempObject(object):
pass
sto = SomeTempObject()
ObjectFiwareConverter.fiware2Obj(json, sto, setAttr=True) # The json from above
The Values are added via setattr and can be accesed by getattr:
print getattr(sto, 'myStr') # --> would print Hi!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fiwareobjectconverter-0.1.1-py3-none-any.whl.
File metadata
- Download URL: fiwareobjectconverter-0.1.1-py3-none-any.whl
- Upload date:
- Size: 25.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc312da188a8947b570c089383078165b4946c03d3584b4f43286db75e34ca3a
|
|
| MD5 |
3e7635762a8b58871044b9ce86e73f84
|
|
| BLAKE2b-256 |
a2dc0f36286a8640e38a679b4e42875c452c6aafc3f41de2652096d4e0eda84c
|