Hmm. I knew about JSON-LD, but I was wanting to build up 
otherwise-json-serializable python objects that happened to contain rdflib.term 
objects, and serialize that to json. I suppose that is playing on hard mode 
though, and I'm better off building up rdflib graphs of what I need, 
serializing them to json-ld, and then picking at them from that point.

Thanks,
Donny

On Fri, Oct 15, 2021, at 3:43 PM, Niklas Lindström wrote:
> 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 <do...@polyneme.xyz> 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 rdflib-dev+unsubscr...@googlegroups.com.
>> 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 rdflib-dev+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rdflib-dev/CADjV5jeHfZUZgYnABPZoJxgJxxouLcvODAXXyaYb-RYx7W-aVw%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/rdflib-dev/CADjV5jeHfZUZgYnABPZoJxgJxxouLcvODAXXyaYb-RYx7W-aVw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

--
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 rdflib-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rdflib-dev/31808f71-da01-474f-87ea-600188645a1f%40www.fastmail.com.

Reply via email to