summaryrefslogtreecommitdiff
path: root/examples/jsonParser.py
diff options
context:
space:
mode:
authorptmcg <ptmcg@austin.rr.com>2020-10-24 23:34:49 -0500
committerptmcg <ptmcg@austin.rr.com>2020-10-24 23:34:49 -0500
commit3c495dbb0fb80cd1600984919a45a5c54baa2806 (patch)
treeb9409cc2461e316e45d2819a190d46e795501105 /examples/jsonParser.py
parent22027ba6256c8a12b08379c790875123f6a20e80 (diff)
downloadpyparsing-git-3c495dbb0fb80cd1600984919a45a5c54baa2806.tar.gz
ParseResults.List class to support returning an actual list from a parse action, plus aslist and asdict args to Group and Dict classes to emit native Python types instead of ParseResults; also update repr() output of ParseResults to include the type name instead of just a bare tuple.
Diffstat (limited to 'examples/jsonParser.py')
-rw-r--r--examples/jsonParser.py64
1 files changed, 51 insertions, 13 deletions
diff --git a/examples/jsonParser.py b/examples/jsonParser.py
index cf01318..6d6b1c2 100644
--- a/examples/jsonParser.py
+++ b/examples/jsonParser.py
@@ -41,6 +41,9 @@ def make_keyword(kwd_str, kwd_value):
return pp.Keyword(kwd_str).setParseAction(pp.replaceWith(kwd_value))
+# set to False to return ParseResults
+RETURN_PYTHON_COLLECTIONS = True
+
TRUE = make_keyword("true", True)
FALSE = make_keyword("false", False)
NULL = make_keyword("null", None)
@@ -52,14 +55,29 @@ jsonNumber = ppc.number()
jsonObject = pp.Forward().setName("jsonObject")
jsonValue = pp.Forward().setName("jsonValue")
+
jsonElements = pp.delimitedList(jsonValue)
-jsonArray = pp.Group(LBRACK + pp.Optional(jsonElements, []) + RBRACK)
-jsonValue << (
- jsonString | jsonNumber | pp.Group(jsonObject) | jsonArray | TRUE | FALSE | NULL
+# jsonArray = pp.Group(LBRACK + pp.Optional(jsonElements, []) + RBRACK)
+# jsonValue << (
+# jsonString | jsonNumber | pp.Group(jsonObject) | jsonArray | TRUE | FALSE | NULL
+# )
+# memberDef = pp.Group(jsonString + COLON + jsonValue).setName("jsonMember")
+
+jsonArray = pp.Group(
+ LBRACK + pp.Optional(jsonElements) + RBRACK, aslist=RETURN_PYTHON_COLLECTIONS
)
-memberDef = pp.Group(jsonString + COLON + jsonValue).setName("jsonMember")
+
+jsonValue << (jsonString | jsonNumber | jsonObject | jsonArray | TRUE | FALSE | NULL)
+
+memberDef = pp.Group(
+ jsonString + COLON + jsonValue, aslist=RETURN_PYTHON_COLLECTIONS
+).setName("jsonMember")
+
jsonMembers = pp.delimitedList(memberDef)
-jsonObject << pp.Dict(LBRACE + pp.Optional(jsonMembers) + RBRACE)
+# jsonObject << pp.Dict(LBRACE + pp.Optional(jsonMembers) + RBRACE)
+jsonObject << pp.Dict(
+ LBRACE + pp.Optional(jsonMembers) + RBRACE, asdict=RETURN_PYTHON_COLLECTIONS
+)
jsonComment = pp.cppStyleComment
jsonObject.ignore(jsonComment)
@@ -72,7 +90,7 @@ if __name__ == "__main__":
"title": "example glossary",
"GlossDiv": {
"title": "S",
- "GlossList":
+ "GlossList": [
{
"ID": "SGML",
"SortAs": "SGML",
@@ -91,22 +109,42 @@ if __name__ == "__main__":
"EmptyDict" : {},
"EmptyList" : []
}
+ ]
}
}
}
"""
results = jsonObject.parseString(testdata)
+
results.pprint()
+ if RETURN_PYTHON_COLLECTIONS:
+ from pprint import pprint
+
+ pprint(results)
+ else:
+ results.pprint()
print()
def testPrint(x):
print(type(x), repr(x))
- print(list(results.glossary.GlossDiv.GlossList.keys()))
- testPrint(results.glossary.title)
- testPrint(results.glossary.GlossDiv.GlossList.ID)
- testPrint(results.glossary.GlossDiv.GlossList.FalseValue)
- testPrint(results.glossary.GlossDiv.GlossList.Acronym)
- testPrint(results.glossary.GlossDiv.GlossList.EvenPrimesGreaterThan2)
- testPrint(results.glossary.GlossDiv.GlossList.PrimesLessThan10)
+ if RETURN_PYTHON_COLLECTIONS:
+ results = results[0]
+ print(list(results["glossary"]["GlossDiv"]["GlossList"][0].keys()))
+ testPrint(results["glossary"]["title"])
+ testPrint(results["glossary"]["GlossDiv"]["GlossList"][0]["ID"])
+ testPrint(results["glossary"]["GlossDiv"]["GlossList"][0]["FalseValue"])
+ testPrint(results["glossary"]["GlossDiv"]["GlossList"][0]["Acronym"])
+ testPrint(
+ results["glossary"]["GlossDiv"]["GlossList"][0]["EvenPrimesGreaterThan2"]
+ )
+ testPrint(results["glossary"]["GlossDiv"]["GlossList"][0]["PrimesLessThan10"])
+ else:
+ print(list(results.glossary.GlossDiv.GlossList.keys()))
+ testPrint(results.glossary.title)
+ testPrint(results.glossary.GlossDiv.GlossList.ID)
+ testPrint(results.glossary.GlossDiv.GlossList.FalseValue)
+ testPrint(results.glossary.GlossDiv.GlossList.Acronym)
+ testPrint(results.glossary.GlossDiv.GlossList.EvenPrimesGreaterThan2)
+ testPrint(results.glossary.GlossDiv.GlossList.PrimesLessThan10)