#!/usr/bin/env python import cgitb cgitb.enable() import re print "Content-Type: text/plain" print print '@prefix json: .' print '@prefix rdf: .' print '@prefix xsd: .' print r_json = re.compile(r'^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]+$') r_string = re.compile(r'("(\\.|[^"\\])*")') env = {'__builtins__': None, 'null': None, 'true': True, 'false': False} def json(text): """Evaluate JSON text safely (we hope).""" if r_json.match(r_string.sub('', text)): text = r_string.sub(lambda m: 'u' + m.group(1), text) return eval(text.strip(' \t\r\n'), env, {}) raise ValueError('Input must be serialised JSON.') def json_value(value): if isinstance(value, dict): for line in json_object(value): yield line # + '\n' elif isinstance(value, list): for line in json_array(value): yield line # + '\n' elif isinstance(value, float) or isinstance(value, int): for line in json_number(value): yield line elif isinstance(value, unicode): for line in json_string(value): yield line elif isinstance(value, bool): for line in json_boolean(value): yield line elif value == None: yield 'json:null' else: raise ValueError('%r' % value) def json_object(obj): yield '[ a json:Object; ' for (key, value) in obj.iteritems(): yield ' json:member [' yield ' json:key ' + '\n'.join(json_string(key)) + '; ' yield ' json:value ' + '\n'.join(json_value(value)) yield ']; ' yield ']' def json_array(arr): if arr: yield '[ a json:Array; ' first, rest = arr[0], arr[1:] yield ' rdf:first ' + '\n'.join(json_value(first)) + '; ' if rest: yield ' rdf:rest (' for element in rest: for line in json_value(element): yield line yield ')' else: yield ' rdf:rest rdf:nil' yield ']' else: yield 'rdf:nil' def json_number(num): lexical = str(num) if not 'e' in lexical: yield '"' + lexical + '"^^xsd:decimal' else: yield '"' + lexical + '"^^xsd:float' def json_string(s): yield '"' + ('%r' % s).lstrip('u')[1:-1] + '"' def json_boolean(b): if b == True: yield 'json:true' else: yield 'json:false' def convert(text): thing = json(text) if isinstance(thing, list): for line in json_array(thing): print line elif isinstance(thing, dict): for line in json_object(thing): print line print '.' test = """ { "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": "100" }, "IDs": [116, 943, 234, 38793] } } """ convert(test) # EOF