Hello Donny,

Perhaps you're in need of JSON-LD (https://json-ld.org/)? Check out how to
use that in RDFLib with the examples at:


https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.plugins.parsers.html#module-rdflib.plugins.parsers.jsonld

and:


https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.plugins.serializers.html#module-rdflib.plugins.serializers.jsonld

Cheers,
Niklas


On Fri, Oct 15, 2021 at 8:19 PM Donny Winston <[email protected]> wrote:

> Hi all,
>
> Perhaps this is hidden somewhere in the rdflib repo and I wasn’t able to
> find it, but I found myself wanting to encode rdflib.term.Literal values to
> JSON as e.g. {“value”: literal.value, “datatype”: literal.datatype, …}. I
> ended up adapting the advice of a SO post. Here is my answer on SO with an
> rdflib example:
> [https://stackoverflow.com/a/69588931/1820042](https://stackoverflow.com/a/69588931/1820042)
> .
>
> Also reproduced below. I hope folks find it useful. Also feel free to
> point out where this has already been done, and I’ll pip install that
> instead of my custom code!
>
> from json.encoder import (_make_iterencode, JSONEncoder,
>                           encode_basestring_ascii, INFINITY,
>                           encode_basestring)
> class CustomObjectEncoder(JSONEncoder):
>
>     def iterencode(self, o, _one_shot=False):
>         """Encode the given object and yield each string
>         representation as available.
>
>         For example::
>
>             for chunk in JSONEncoder().iterencode(bigobject):
>                 mysocket.write(chunk)
>
>         Change from json.encoder.JSONEncoder.iterencode is setting
>         _one_shot=False and isinstance=self.isinstance
>         in call to `_make_iterencode`.
>         And not using `c_make_encoder`.
>
>         """
>         if self.check_circular:
>             markers = {}
>         else:
>             markers = None
>         if self.ensure_ascii:
>             _encoder = encode_basestring_ascii
>         else:
>             _encoder = encode_basestring
>
>         def floatstr(o, allow_nan=self.allow_nan,
>                 _repr=float.__repr__, _inf=INFINITY, _neginf=-INFINITY):
>             # Check for specials.  Note that this type of test is processor
>             # and/or platform-specific, so do tests which don't depend on the
>             # internals.
>
>             if o != o:
>                 text = 'NaN'
>             elif o == _inf:
>                 text = 'Infinity'
>             elif o == _neginf:
>                 text = '-Infinity'
>             else:
>                 return _repr(o)
>
>             if not allow_nan:
>                 raise ValueError(
>                     "Out of range float values are not JSON compliant: " +
>                     repr(o))
>
>             return text
>
>         _iterencode = _make_iterencode(
>                 markers, self.default, _encoder, self.indent, floatstr,
>                 self.key_separator, self.item_separator, self.sort_keys,
>                 self.skipkeys, _one_shot=False, isinstance=self.isinstance)
>         return _iterencode(o, 0)
>
> Example subclass:
>
> import datetime
> from rdflib.term import Literal, BNode
> class RDFTermEncoder(CustomObjectEncoder):
>     def isinstance(self, o, cls):
>         if isinstance(o, (Literal, BNode)):
>             return False
>         return isinstance(o, cls)
>     def default(self, o):
>         if isinstance(o, Literal):
>             rv = {"value": o.value}
>             if o.datatype is not None:
>                 rv["datatype"] = o.datatype
>             if o.language is not None:
>                 rv["lang"] = o.language
>             return rv
>         if isinstance(o, BNode):
>             return "http://localhost/bnode/"; + str(o)
>         if isinstance(o, datetime.datetime):
>             return o.isoformat()
>         if isinstance(o, datetime.date):
>             return str(o)
>         # Let the base class default method raise the TypeError
>         return super().default(o)
>
> I just used this successfully for my work as
>
> db_json = json.loads(json.dumps(db_custom, cls=RDFTermEncoder))
>
> Best,
> Donny
>
> —
> Donny Winston, PhD (he/him/his) | Polyneme LLC
> https://donnywinston.com | https://polyneme.xyz
>
> If I’ve emailed you, I’d love to speak with you.
> Schedule a meeting (15min+): https://meet.polyneme.xyz
>
> --
> http://github.com/RDFLib
> ---
> You received this message because you are subscribed to the Google Groups
> "rdflib-dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/rdflib-dev/5a70d567-652c-45da-b500-7776447210dd%40www.fastmail.com
> <https://groups.google.com/d/msgid/rdflib-dev/5a70d567-652c-45da-b500-7776447210dd%40www.fastmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
http://github.com/RDFLib
--- 
You received this message because you are subscribed to the Google Groups 
"rdflib-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rdflib-dev/CADjV5jeHfZUZgYnABPZoJxgJxxouLcvODAXXyaYb-RYx7W-aVw%40mail.gmail.com.

Reply via email to