I am fetching a .js file from a remote site that contains data I want to process as JSON using the simplejson library on my Google App Engine site. The .js file looks like this:
var txns = [
{ apples: '100', oranges: '20', type: 'SELL'},
{ apples: '200', oranges: '10', type: 'BUY'}]
I have no control over the format of this file. What I did at first just to hack through it was to chop the "var txns = "
bit off of the string and then do a series of .replace(old, new, [count])
on the string until it looked like standard JSON:
cleanJSON = malformedJSON.replace("'", '"').replace('apples:', '"apples":').replace('oranges:', '"oranges":').replace('type:', '"type":').replace('{', '{"transaction":{').replace('}', '}}')
So that it now looks like:
[{ "transaction" : { "apples": "100", "oranges": "20", "type": "SELL"} },
{ "transaction" : { "apples": "200", "oranges": "10", "type": "BUY"} }]
How would you tackle this formatting issue? Is there a known way (library, script) to format a JavaScript array into JSON notation?
It's not too difficult to write your own little parsor for that using PyParsing.
import json
from pyparsing import *
data = """var txns = [
{ apples: '100', oranges: '20', type: 'SELL'},
{ apples: '200', oranges: '10', type: 'BUY'}]"""
def js_grammar():
key = Word(alphas).setResultsName("key")
value = QuotedString("'").setResultsName("value")
pair = Group(key + Literal(":").suppress() + value)
object_ = nestedExpr("{", "}", delimitedList(pair, ","))
array = nestedExpr("[", "]", delimitedList(object_, ","))
return array + StringEnd()
JS_GRAMMAR = js_grammar()
def parse(js):
return JS_GRAMMAR.parseString(js[len("var txns = "):])[0]
def to_dict(object_):
return dict((p.key, p.value) for p in object_)
result = [
{"transaction": to_dict(object_)}
for object_ in parse(data)]
print json.dumps(result)
This is going to print
[{"transaction": {"type": "SELL", "apples": "100", "oranges": "20"}},
{"transaction": {"type": "BUY", "apples": "200", "oranges": "10"}}]
You can also add the assignment to the grammar itself. Given there are already off-the-shelf parsers for it, you should better use those.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With