Sean,
I've done a bit of digging, an unfortunatly, writing a cjson codec would be
non-trivial, or impossible; unless the author(s) of that package provided a
hook (like JSONEcoder.default is)
jsonlib's write (equivilent of dumps/encode) has an 'on_unknown' hook, so
that'd work,
as would all other pure-python json libraries.
A jsonlib codec might look like:
class JsonlibCodec(object):
def encode(self, obj, **kwargs):
def on_unknown(value):
d = dict(gejsonlib.GeoJSON.to_instance(value))
return jsonlib.write(d)
kwargs["on_unknown"] = on_unknown
return jsonlib.write(obj, **kwargs)
def decode(self, json, **kwargs):
obj_hooj = kwargs.get("object_hook", hoo)
o = jsonlib.read(json)
if obj_hook:
o = obj_hook(o)
return o
A json-py codec might look like:
import json
class JsonPyCodec(object):
def encode(self, obj, *args, **kwargs):
json_writer = json.JsonWriter()
try:
return json_writer.write(obj)
except json.WriteException: # not a python object corrospondng to
'primative' json type
return
json_writer.write(dict(geojsonlib.GeoJSON.to_instance(obj)))
def decode(obj, *args, **kwargs):
obj_hook = kwargs.pop("object_hook", lambda x: obj)
return json.JsonReader().read(obj_hooj(obj))
Matt
2008/6/18 Matthew Russell <[EMAIL PROTECTED]>:
> Sean,
>
> I'd be ok with keeping loads/dumps as functions in geojsonlib/__init__.py
> They could even raise DepricationWaring.
>
> I've seen r1113's encoding.py, and it's similar to what I had in mind, but
> not quite.
>
> There's an extra level of indirection, geojsonlib/__init__ would define:
>
> # nb. in the following, geojsonlib.encoding is renamed to codecs
>
> def encode(obj, codec=None, *args, **kwargs):
> codec = codec or geojsonlib.codecs.default
> return codec.encode(obj, *args, **kwargs)
>
> decode would be much the same.
> Then I can write a CJson() codec (which defines encode and decode), and
> have that used instead.
>
> in geojsonlib.codecs, my hacked up version of the module goes something
> like:
>
> class JSONCodec(objet):
> def encode(self, obj, **kwargs): raise NotImplemented
> def decode(self, obj, **kwargs): raise NotImplemented
>
> try:
> import simplejson
> except ImportError:
> default = Codec()
> else:
> class SimpleJSONCodec(JSONCodec):
>
> def encode(self obj, **kwargs):
> return simplejson.dumps(obj, **kwargs)
>
> def decode(self, obj, **kwargs):
> return simplejson.loads(obj, **kwargs)
>
> default = SimepJSONCodec
>
>
> Cheers,
> Matt
>
> 2008/6/18 Sean Gillies <[EMAIL PROTECTED]>:
>
> Matt,
>>
>> What would you think about keeping geojsonlib.dumps/loads as is for
>> convenience and just raise exceptions if simplejson can't be imported?
>> See rev 1113 -- I marked the dump/load feature as an "extra" in setup.py.
>>
>> Sean
>>
>> Matthew Russell wrote:
>> > Hi,
>> >
>> > this is a proposal which Sean already +1'd in the recent "[Community]
>> [Fwd:
>> > [Geojson] GeoJSON 1.0 Released]" thread.
>> >
>> > The proposal is to remove the reliance on simplejson from geojsonlib
>> (but
>> > keeping simplejson as the default).
>> >
>> > I'n slight alteration to my previous api suggestion for the interface
>> for
>> > simplejson's peers,
>> > I'd like to change the api from:
>> >
>> > geojsonlib.{dumps, dump, loads, load}
>> >
>> > to:
>> >
>> > json = geojsonlib.encode(obj, codec="geojsonlib.defaultcodec",
>> *codec_args,
>> > **codec_kwargs)
>> > - where obj is any python object supporting the geointerface, or a
>> mapping
>> > - returns unicode or str
>> >
>> > obj = geojsonlib.decode(json, codec="geojsonlib.defaultcodec",
>> *codec_args,
>> > **codec_kwargs)
>> >
>> > - where 'json' is a unicode or str instance.
>> > - reutrns a geojsonlib.GeoJSON instance or subclass thereof.
>> >
>> > The primary motivation for this is file encoding.
>> > I'd like to keep the serialisation to file-like objects within the
>> control
>> > of the user at the I/O boundaries.
>> > Removing the dump and load functions from geojsonlib would acheive this.
>> > I also think the names encode and decode are better, since load and
>> dumps
>> > indicate serialization to disk.
>> >
>> > So, does anyone object if the api changes from:
>> > geojsonlib.dumps -> geojson.encode
>> > geojsonlib.loads -> geojson.decode
>> > geojsonlib.dump -> file_like.write(geojsonlib.encode(obj))
>> > geojsonlib.load -> geojsonlib.decode(file_like.read())
>> >
>> > ?
>> >
>> > Once this is implemented, simplejson will only be required in the
>> default
>> > case:
>> >
>> > .encode(obj), .decode(obj)
>> >
>> > and not if you want to use another JSON library, and have an adapter:
>> >
>> > e.g
>> >
>> > class CjsonEncoder:
>> > def encode(self, obj):
>> > ...
>> >
>> > .encode(obj, codec=CjsonEncoder)
>> >
>> > N.B:
>> >
>> > 'codec' can be a dotted path, or any namespace with a .encode or .decode
>> > callable attribute as releveant.
>> >
>> > --
>> > Cheers,
>> > Matt
>> >
>> >
>> >
>> > ------------------------------------------------------------------------
>> >
>> > _______________________________________________
>> > Community mailing list
>> > [email protected]
>> > http://lists.gispython.org/mailman/listinfo/community
>>
>> _______________________________________________
>> Community mailing list
>> [email protected]
>> http://lists.gispython.org/mailman/listinfo/community
>>
>
>
>
_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community