1.问题

  在遇到json数据的过程中,我们经常需要获取json数据中某个值的操作,如果是用get方法去取比较繁琐,接下来介绍两种方式来取值。

2.jsonpath来格式化处理json数据

2.1介绍

JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括JavaScript、Python、PHP和Java。JsonPath对于JSON来说,就相当于XPATH对于XML。

JsonPath结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

2.2安装

pip安装:
pip install jsonpath 官网文档:http://goessner.net/articles/JsonPath

2.3使用

使用方法:

# 导入
import jsonpath # 结果会以列表形式返回,如下请求接口返回数据提取例子
jsonpath.jsonpath(参数1,参数2)[] # 参数
参数1:数据对象
参数2:jsonpath表达式
[]:如果有重复的键,需要获取第几个键的值

2.4使用示例:

import jsonpath

json_data = {
"resultcode":"200",
"reason":"成功的返回",
"result":
{
"company":"顺丰",
"com":"sf",
"no":"575677355677",
"list":[
{
"datetime":"2013-06-25 10:44:05",
"remark":"已收件",
"zone":"台州市"
},
{
"datetime":"2013-06-25 11:05:21",
"remark":"快件在 台州 ,准备送往下一站 台州集散中心 ",
"zone":"台州市"
}
],
"status":1
},
"error_code":0
} resultcode = jsonpath.jsonpath(json_data,"$..resultcode")[0]
print("返回的code:",resultcode)
company = jsonpath.jsonpath(json_data, "$..company")[0]
print("快递公司:",company)
remark = jsonpath.jsonpath(json_data,"$..remark")[-1]
print("快递目前到达的地点:",remark) 结果:
返回的code: 200
快递公司: 顺丰
快递目前到达的地点: 快件在 台州 ,准备送往下一站 台州集散中心

3.jmespath来格式化处理json数据

jmespath是另一种用来处理json数据的库。

3.1安装

pip安装:
pip install jmespath 官网文档:https://jmespath.org/tutorial.html

3.2基本操作

import jmespath

source = {"a": "foo", "b": "bar", "c": "baz"}
result = jmespath.search('b', source) print(repr(result)) 结果:
'bar'

3.3 .操作符

import jmespath

source1 = {"a": {"b": {"c": {"d": "value"}}}}
result1 = jmespath.search('a.b.c', source1)
print(repr(result1)) 结果:
{'d': 'value'}

3.4下标操作(仅用于数组)

import jmespath

source_2 = ["a", "b", "c", "d", "e", "f"]
index_result = jmespath.search("[1]",source_2)
print(repr(index_result)) 结果:
'b'

3.5下标和.操作符混合操作

import jmespath

source3 = {"a": {
"b": {
"c": [
{"d": [0, [1, 2]]},
{"d": [3, 4]}
]
}
}}
result3 = jmespath.search('a.b.c[0].d[1][0]',source3)
print(repr(result3)) 结果:
1

3.6接下来用实际的json数据测试一下

import jmespath

json_data = {
"resultcode":"200",
"reason":"成功的返回",
"result":
{
"company":"顺丰",
"com":"sf",
"no":"575677355677",
"list":[
{
"datetime":"2013-06-25 10:44:05",
"remark":"已收件",
"zone":"台州市"
},
{
"datetime":"2013-06-25 11:05:21",
"remark":"快件在 台州 ,准备送往下一站 台州集散中心 ",
"zone":"台州市"
}
],
"status":1
},
"error_code":0
} resultcode = jmespath.search("resultcode",json_data)
print("返回的code:",resultcode)
company = jmespath.search("result.company",json_data)
print("快递公司:",company)
remark = jmespath.search("result.list[1].remark",json_data)
print("快递目前到达的地点:",remark) 结果:
返回的code: 200
快递公司: 顺丰
快递目前到达的地点: 快件在 台州 ,准备送往下一站 台州集散中心

3.7jmespath的其他使用方式

  •切片

import jmespath

source_4 = ["a", "b", "c", "d", "e", "f"]
result4 = jmespath.search("[1:3]",source_4)
print(repr(result4)) 结果:
['b', 'c']

  •投影

投影其实就是初始时定义好格式,然后按照格式的方式进行取值。
投影主要包括以下几种:
  List Projections列表投影
  Slice Projections切片投影
  Object Projections对象投影
  Flatten Projections正则投影
  Filter Projections过滤条件投影
注意:取列表用[],取字典用.

列表和切片投影
import jmespath

source5 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
result5 = jmespath.search('people[*].first', source5)
print(result5) 结果:
['James', 'Jacob', 'Jayden']

对象投影

列表投影是为JSON数组定义的,而对象投影是为JSON对象定义的。

import jmespath

source6 = {
"ops": {
"functionA": {"numArgs": 2},
"functionB": {"numArgs": 3},
"functionC": {"variadic": True}
}
}
result6 = jmespath.search('ops.*.numArgs', source6)
print(repr(result6)) 结果:
[2, 3]

Filter Projections  带过滤条件投影
格式[? <expression> <comparator> <expression>]
支持 ==, !=, <, <=, >, >=

import jmespath

source7 = {
"people": [
{
"general": {
"id": 100,
"age": 20,
"other": "foo",
"name": "Bob"
},
"history": {
"first_login": "2014-01-01",
"last_login": "2014-01-02"
}
},
{
"general": {
"id": 101,
"age": 30,
"other": "bar",
"name": "Bill"
},
"history": {
"first_login": "2014-05-01",
"last_login": "2014-05-02"
}
}
]
}
result7 = jmespath.search("people[?general.age > `20`].general | [0]", source7)
print(repr(result7)) 结果:
{'id': 101, 'age': 30, 'other': 'bar', 'name': 'Bill'}

4.自己写个类来处理json数据

class ExtractData:

    def traverse_take_field(data,fields,values=[],currentKye=None):
'''
遍历嵌套字典列表,取出某些字段的值
:param data: 嵌套字典列表
:param fields: 列表,某些字段
:param values: 返回的值
:param currentKye: 当前的键值
:return: 列表
'''
if isinstance(data,list):
for i in data:
ExtractData.traverse_take_field(i,fields,values,currentKye)
elif isinstance(data,dict):
for key,value in data.items():
ExtractData.traverse_take_field(value,fields,values,key)
else:
if currentKye in fields:
values.append(data)
return values if __name__ == '__main__':
json_data = {
"resultcode":"200",
"reason":"成功的返回",
"result":{
"company":"顺丰",
"com":"sf",
"no":"575677355677",
"list":[
{
"datetime":"2013-06-25 10:44:05",
"remark":"已收件",
"zone":"台州市"
},
{
"datetime":"2013-06-25 11:05:21",
"remark":"快件在 台州 ,准备送往下一站 台州集散中心 ",
"zone":"台州市"
}
],
"status":1
},
"error_code":0
}
resultcode = ExtractData.traverse_take_field(data=json_data,fields="resultcode")
print("返回的code:",resultcode) 结果:
返回的code: ['200']

目前自己写的这个类还不完善,有以下几个缺点:

1、只能获取最底层的值

2、重复的键例如:remark,获取值后,会把所有的值都获取出来。

3、对于包含的键,无法做出区分,列如:想要获取键company的值,会吧键com的值也一起获取出来。

等有时间可以继续完善。

Python格式化处理json数据的方式的更多相关文章

  1. Python格式化输出的三种方式

    Python格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式比如要求用户输入用户名和年龄,然后打印如下格式:My name is xxx,my age ...

  2. (数据科学学习手札125)在Python中操纵json数据的最佳方式

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常使用Python的过程中,我们经常会 ...

  3. 【转】让浏览器格式化显示JSON数据之chrome jsonView插件安装

    jsonView 用来让Chrome浏览器能格式化的显示JSON数据. 以上是网上找的方式,且试验成功! 步骤: 1.打开 https://github.com : 2.搜索 jsonView 链接: ...

  4. 8种json数据查询方式

    你有没有对“在复杂的JSON数据结构中查找匹配内容”而烦恼.这里有8种不同的方式可以做到: JsonSQL JsonSQL实现了使用SQL select语句在json数据结构中查询的功能. 例子: ? ...

  5. Python爬虫之三种数据解析方式

    一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...

  6. 3中转换JSON数据的方式

    一:前言 来公司一个星期,把最近做的东西梳理下,并把觉得有必要的知识点记载下,现在传数据很多都是用JSON来传数据,所以我就找了集中传json的方式,其实是有五种的,但是有一个我没有用过,太陌生了,上 ...

  7. jQuery格式化显示json数据

    一.概述 JSONView 在gitlab上面,有一个jQuery JSONView插件,地址为:https://github.com/yesmeck/jquery-jsonview demo地址:h ...

  8. vue项目中使用插件将字符串装化为格式化的json数据(可伸缩)

    插件地址:https://www.npmjs.com/package/vue-json-viewer 第一步:安装vue-json-viewer插件 $ npm install vue-json-vi ...

  9. c#处理3种json数据的方式

    原文出处:http://www.jb51.net/article/48027.htm 一.C#处理简单json数据 json数据: {"result":"0", ...

随机推荐

  1. 在Linux下面端口映射socat自动脚本

    这个sh脚本可以方面的端口映射,在使用本功能之前请确保socat已经放到了/usr/bin/socat #!/bin/bash cd `dirname $0` let listenport=`base ...

  2. 浅析Python闭包

    1.什么是闭包 在介绍闭包概念前,我们先来看一段简短的代码 def sum_calc(*args): def wrapper(): sum = 0 for n in args: sum += n; r ...

  3. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  4. wildfly 21中应用程序的部署

    目录 简介 Managed Domain中的部署 管理展开的部署文件 standalone模式下的部署 standalone模式下的自动部署 Marker Files 受管理的和不受管理的部署 部署覆 ...

  5. .netcore 微服务快速开发框架 Anno&Viper -分布式锁是个什么鬼

    1.什么是锁 锁是为了解决多线程或者多进程资源竞争的问题. 同一进程的多个线程资源竞争可以用lock解决. lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线 ...

  6. JavaDailyReports10_18

    学习内容:HTML基本知识 1.通常标记具有默认属性,当一个标记中只有标记名时,使用默认属性. 2.HTML标记有两种:单标记和双标记,单标记的语法格式:  <标记名称/> 3.不同的属性 ...

  7. 二本非科班,秋招,实习,面试,offer之路

    不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...

  8. window下运行nginx出现nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)

    做谷粒学院项目,用nginx出现nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a s ...

  9. Typecho 主题更换

    Typecho 主题更换 前言 上一篇已经搭建自己的 Typecho 博客,博客搭建完成自带一个默认主题,不是很喜欢默认的主题,想换一个自己喜欢的主题,并在基础上进行修改. 本文就介绍下如何更换和自定 ...

  10. python之 logging 模块(上篇)

    一.日志关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变量数据的消息来描述.此外,事件 ...