python教程系列(三.6.1、JSON)

本文详细介绍了如何使用Python的json模块进行数据的序列化和反序列化操作,包括将字典和列表转换为JSON字符串,以及从JSON字符串或文件中读取数据结构。通过实例演示了JSON在不同数据类型间的应用。

在这里插入图片描述

文章目录

json

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

Json模块提供了四个功能:dumps、dump、loads、load

import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的

dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}


list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
import json
f = open('json_file','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()

f = open('json_file')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)
import json
#dct="{'1':111}"#json 不认单引号
#dct=str({"1":111})#报错,因为生成的数据还是单引号:{'one': 1}

dct='{"1":"111"}'
print(json.loads(dct))

#conclusion:
#        无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads

在这里插入图片描述

### Kettle 6.1 JsonInput 组件中 BadStructure 错误的解决方案 在 Kettle(Pentaho Data Integration)6.1 版本中,`JsonInput` 组件出现 `BadStructure` 错误通常是因为输入的 JSON 数据结构不符合预期或解析规则不匹配。以下是一些可能的原因及解决方法: #### 1. JSON 数据格式问题 确保输入的 JSON 数据是合法且符合标准的。如果 JSON 数据存在语法错误(例如缺少逗号、引号不匹配等),`JsonInput` 组件将无法正确解析并抛出 `BadStructure` 错误[^2]。 - **解决方法**:使用在线 JSON 校验工具(如 https://jsonlint.com/)验证 JSON 数据的合法性,并修正任何语法错误。 #### 2. JSON 路径表达式配置错误 `JsonInput` 组件需要通过 JSONPath 表达式指定如何解析 JSON 数据。如果路径表达式配置错误或与实际数据结构不匹配,也可能导致 `BadStructure` 错误。 - **解决方法**:检查 `JsonInput` 组件中的 JSONPath 配置是否正确。确保路径表达式能够准确指向目标字段。例如,对于如下 JSON 数据: ```json { "name": "John", "age": 30, "address": { "city": "New York", "zip": "10001" } } ``` 若要提取 `city` 字段,JSONPath 应为 `$.address.city`[^3]。 #### 3. 嵌套 JSON 数据处理 如果 JSON 数据包含嵌套结构,而 `JsonInput` 组件未正确配置以处理嵌套数据,则可能导致 `BadStructure` 错误。 - **解决方法**:在 `JsonInput` 组件中启用“重复 JSON 对象”选项,并确保 JSONPath 表达式能够正确解析嵌套结构。例如,对于以下 JSON 数据: ```json [ { "id": 1, "details": [ {"item": "A", "quantity": 5}, {"item": "B", "quantity": 10} ] }, { "id": 2, "details": [ {"item": "C", "quantity": 3} ] } ] ``` 可以使用路径表达式 `$..details[*]` 来提取所有 `details` 数组中的对象[^4]。 #### 4. 数据源编码问题 如果 JSON 数据的编码格式与 `JsonInput` 组件的默认编码设置不一致,也可能引发 `BadStructure` 错误。 - **解决方法**:在 `JsonInput` 组件中明确指定输入文件的编码格式(如 UTF-8)。可以通过组件的“高级”选项进行设置[^5]。 #### 5. Kettle 版本兼容性问题 Kettle 6.1 版本可能存在某些已知问题,特别是在处理复杂 JSON 数据时。如果上述方法均未能解决问题,建议升级到更高版本的 Kettle。 - **解决方法**:下载并安装最新版本的 Kettle(如 9.x 或更高版本),然后重新测试 `JsonInput` 组件的功能[^6]。 ```python # 示例代码:验证 JSON 数据合法性 import json def validate_json(json_data): try: json.loads(json_data) print("JSON 数据合法") except ValueError as e: print(f"JSON 数据非法: {e}") json_data = '{"name": "John", "age": 30}' validate_json(json_data) ``` ### 结论 通过以上方法可以有效解决 Kettle 6.1 版本中 `JsonInput` 组件出现的 `BadStructure` 错误。关键在于确保输入 JSON 数据的合法性、正确配置 JSONPath 表达式以及处理嵌套结构和编码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值