Skip to content

Instantly share code, notes, and snippets.

@weixinfree
Last active March 1, 2022 03:12
Show Gist options
  • Select an option

  • Save weixinfree/353e11732be2d80bbb8d53c0839afdff to your computer and use it in GitHub Desktop.

Select an option

Save weixinfree/353e11732be2d80bbb8d53c0839afdff to your computer and use it in GitHub Desktop.
json parser
from parser import (
a,
sepby,
maybe,
many,
string,
java_float,
java_int,
const,
forward_decl,
finished,
)
import logging
logging.basicConfig(level=logging.INFO)
def mk_obj(members):
if not members:
return {}
return dict(members)
def mk_array(items):
if not items:
return []
return list(items)
true = a("true") >> const(True)
false = a("false") >> const(False)
null = a("null") >> const(None)
number = java_int | java_float.named("number")
value = forward_decl().named("value")
member = (string + ~a(":") + value).named("member")
json_object = (~a("{") + maybe(sepby(member, a(","))) + ~a("}")) >> mk_obj
json_object.name = "json_object"
json_array = (~a("[") + maybe(sepby(value, a(","))) + ~a("]")) >> mk_array
json_array.name = "json_list"
value.define(null | true | false | string | number | json_object | json_array)
jsonparser = (json_array | json_object) + ~finished
def loads(text: str):
return jsonparser.parse(text)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment