我正在尝试使用Python从JSON中提取有用信息的不同方法。我尝试了jsonpath_rw_ext和jsonpath_ng。现在我可以使用jsonpath_rw_ext但jsonpath_ng不起作用。我不想放弃jsonpath_ng,因为我可能没有以正确的方式使用它。检查以下代码:
import jsonpath_rw_ext
from jsonpath_ng.ext import parse
import json
from pprint import pprint
json_str = '''{
"students": [
{"name": "Peter", "gender": "Male", "age": 20},
{"name": "Mary", "gender": "Female", "age": 30},
{"name": "Susan", "gender": "Female", "age": 40}
],
"teachers": [
{"name": "William", "gender": "Male", "age": 30},
{"name": "John", "gender": "Male", "age": 40},
{"name": "Lucy", "gender": "Female", "age": 50}
]
}'''
json_obj = json.loads(json_str)
print 'jsonpath_rw_ext:'
female_students = jsonpath_rw_ext.match('$.students[?gender=="Female"]', json_obj)
pprint(female_students)
print 'jsonpath_ng:'
female_students = parse('$.students[?gender=="Female"]').find(json_obj)
pprint(female_students)
jsonpath_rw_ext部分输出以下结果,正常:jsonpath_rw_ext:
[{u'age': 30, u'gender': u'Female', u'name': u'Mary'},
{u'age': 40, u'gender': u'Female', u'name': u'Susan'}]
但jsonpath_ng部分输出以下结果,我无法理解。 jsonpath_ng是否有任何特定原因返回以下结果?我怎样才能以简单的方式获得类似的结果?
jsonpath_ng返回的结果:
[
DatumInContext(
value={
u'gender': u'Female', u'age': 30, u'name': u'Mary'
},
path=<jsonpath_ng.jsonpath.Index object at 0x000000000315AA90>,
context=DatumInContext(
value=[
{u'gender': u'Male', u'age': 20, u'name': u'Peter'},
{u'gender': u'Female', u'age': 30, u'name': u'Mary'},
{u'gender': u'Female', u'age': 40, u'name': u'Susan'}
],
path=Fields('students'),
context=DatumInContext(
value={
u'students': [
{u'gender': u'Male', u'age': 20, u'name': u'Peter'},
{u'gender': u'Female', u'age': 30, u'name': u'Mary'},
{u'gender': u'Female', u'age': 40, u'name': u'Susan'}
],
u'teachers': [
{u'gender': u'Male', u'age': 30, u'name': u'William'},
{u'gender': u'Male', u'age': 40, u'name': u'John'},
{u'gender': u'Female', u'age': 50, u'name': u'Lucy'}
]
},
path=Root(),
context=None
)
)
),
DatumInContext(
value={u'gender': u'Female', u'age': 40, u'name': u'Susan'},
path=<jsonpath_ng.jsonpath.Index object at 0x000000000315ABA8>,
context=DatumInContext(
value=[
{u'gender': u'Male', u'age': 20, u'name': u'Peter'},
{u'gender': u'Female', u'age': 30, u'name': u'Mary'},
{u'gender': u'Female', u'age': 40, u'name': u'Susan'}
],
path=Fields('students'),
context=DatumInContext(
value={
u'students': [
{u'gender': u'Male', u'age': 20, u'name': u'Peter'},
{u'gender': u'Female', u'age': 30, u'name': u'Mary'},
{u'gender': u'Female', u'age': 40, u'name': u'Susan'}
],
u'teachers': [
{u'gender': u'Male', u'age': 30, u'name': u'William'},
{u'gender': u'Male', u'age': 40, u'name': u'John'},
{u'gender': u'Female', u'age': 50, u'name': u'Lucy'}
]
},
path=Root(),
context=None
)
)
)
]
find()方法返回DatumInContext对象的列表。所以你可以使用List解析。为了从DatumInContext获取值,您可以使用其属性值,该属性值将返回与您响应的相同的值。
jsonpath_rw_ext.match('$.students[?gender=="Female"]', json_obj)
所以,而不是使用
pprint(female_students)
直接,你可以通过解析列表项及其值来使用female_students
pprint([match.value for match in female_students])