影刀RPA JSON文件处理读写与嵌套解析署名林焱什么情况用什么RPA流程中大量使用JSON——API返回数据、配置文件、网页数据交互。掌握JSON的读写和嵌套解析是处理API数据的必备技能。场景推荐函数特点读取JSON文件json.load文件读取JSON字符串转字典json.loads字符串解析字典转JSON字符串json.dumps序列化写入JSON文件json.dump文件写入怎么做一基础读写importjson# 写入JSON文件config{site_url:https://example.com,max_retries:3,timeout:30,headers:{User-Agent:Mozilla/5.0,Accept:application/json},targets:[首页,产品页,关于我们]}withopen(rD:\config\settings.json,w,encodingutf-8)asf:# ensure_asciiFalse: 中文不转义为\uXXXX# indent2: 格式化缩进json.dump(config,f,ensure_asciiFalse,indent2)# 读取JSON文件withopen(rD:\config\settings.json,r,encodingutf-8)asf:configjson.load(f)print(config[site_url])print(config[headers][User-Agent])print(config[targets][0])二字符串与JSON互转拼多多店群自动化上架方案importjson# JSON字符串 → Python字典解析API响应api_response{code: 0, data: {name: 张三, age: 28}, message: success}resultjson.loads(api_response)print(result[code])# 0print(result[data][name])# 张三print(result[data][age])# 28# Python字典 → JSON字符串构造API请求体request_data{action:search,filters:{category:电子产品,price_min:100,price_max:5000}}json_strjson.dumps(request_data,ensure_asciiFalse)print(json_str)三嵌套JSON解析importjson# 复杂嵌套JSONapi_data{status:ok,results:[{id:1,name:商品A,price:99.9,tags:[热销,新品],seller:{name:XX旗舰店,rating:4.8,address:{city:杭州,district:西湖区}}},{id:2,name:商品B,price:199.0,tags:[推荐],seller:{name:YY专营店,rating:4.5,address:{city:上海,district:浦东新区}}}]}# 安全取值函数避免KeyErrordefsafe_get(data,*keys,defaultNone):安全获取嵌套字典的值forkeyinkeys:ifisinstance(data,dict):datadata.get(key,default)else:returndefaultreturndata# 提取所有商品信息foriteminapi_data[results]:namesafe_get(item,name)pricesafe_get(item,price)sellersafe_get(item,seller,name)citysafe_get(item,seller,address,city)tagssafe_get(item,tags,default[])print(f商品:{name}, 价格:{price}, 卖家:{seller}, 城市:{city}, 标签:{tags})四JSON配置管理importjsonimportosfromdatetimeimportdatetimeclassJsonConfig:JSON配置文件管理器def__init__(self,config_path):self.pathconfig_path self.data{}self.load()defload(self):加载配置ifos.path.exists(self.path):withopen(self.path,r,encodingutf-8)asf:self.datajson.load(f)else:self.data{}returnself.datadefsave(self):保存配置os.makedirs(os.path.dirname(self.path),exist_okTrue)withopen(self.path,w,encodingutf-8)asf:json.dump(self.data,f,ensure_asciiFalse,indent2)defget(self,key,defaultNone):获取值支持点分隔的路径a.b.ckeyskey.split(.)valueself.dataforkinkeys:ifisinstance(value,dict):valuevalue.get(k,default)else:returndefaultreturnvalueifvalueisnotNoneelsedefaultdefset(self,key,value):设置值支持点分隔的路径keyskey.split(.)dataself.dataforkinkeys[:-1]:ifknotindata:data[k]{}datadata[k]data[keys[-1]]value self.save()defupdate(self,dict_data):批量更新self.data.update(dict_data)self.save()# 使用configJsonConfig(rD:\config\flow_config.json)# 读取支持点路径urlconfig.get(api.base_url,https://default.com)timeoutconfig.get(api.timeout,30)# 写入config.set(api.base_url,https://api.example.com)config.set(api.timeout,15)config.set(last_run,datetime.now().strftime(%Y-%m-%d %H:%M))完整流程API数据解析保存importjsonimportosfromdatetimeimportdatetime# yd_input: api_response (JSON字符串), output_dirapi_responseyd_input.get(api_response,{})output_diryd_input.get(output_dir,rD:\数据\API结果)# 解析API响应try:datajson.loads(api_response)exceptjson.JSONDecodeErrorase:yd_output{status:error,message:fJSON解析失败:{e}}else:# 提取数据results[]ifisinstance(data,dict):# 单个对象ifdataindata:itemsdata[data]ifisinstance(items,list):foriteminitems:results.append({id:item.get(id),name:item.get(name,),price:item.get(price,0),stock:item.get(stock,0),status:item.get(status,unknown)})elifisinstance(items,dict):results.append({id:items.get(id),name:items.get(name,),price:items.get(price,0),})elifisinstance(data,list):# 直接是数组foritemindata:ifisinstance(item,dict):results.append({id:item.get(id),name:item.get(name,),price:item.get(price,0),})# 保存结果os.makedirs(output_dir,exist_okTrue)timestampdatetime.now().strftime(%Y%m%d_%H%M%S)output_pathos.path.join(output_dir,fapi_result_{timestamp}.json)withopen(output_path,w,encodingutf-8)asf:json.dump({fetch_time:timestamp,count:len(results),data:results},f,ensure_asciiFalse,indent2)yd_output{status:ok,count:len(results),output:output_path}有什么坑坑一JSON中的中文被转义成\uXXXX现象写入JSON文件后中文变成了\u5f20\u4e09这种形式。原因json.dumps默认ensure_asciiTrue会把非ASCII字符转义。解决设置ensure_asciiFalseimportjson data{name:张三,city:北京}# 正确中文正常显示json_strjson.dumps(data,ensure_asciiFalse)print(json_str)# {name: 张三, city: 北京}# 错误中文被转义# json_str json.dumps(data) ❌# {name: \u5f20\u4e09, city: \u5317\u4eac}# 写入文件时也要加withopen(data.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)坑二JSON解析失败格式错误现象json.loads报JSONDecodeError: Expecting property name enclosed in double quotes。原因JSON规范要求键名和字符串值必须用双引号不能用单引号。Python字典可以用单引号但JSON不行。解决TEMU店群如何管理运营importjson# 正确的JSON双引号datajson.loads({name: 张三, age: 28})# 错误单引号不是合法JSON# data json.loads({name: 张三, age: 28}) ❌# 如果数据源用了单引号比如Python repr输出需要先替换bad_json{name: 张三, age: 28}fixed_jsonbad_json.replace(,)try:datajson.loads(fixed_json)except:# 更安全的方式用ast.literal_eval解析Python字面量importast dataast.literal_eval(bad_json)坑三JSON中数值精度丢失现象API返回的金额是99.90解析后变成了99.9。或者大整数丢失精度。原因JSON的数字类型在Python中被解析为float或intfloat会有精度问题。解决金额用字符串传输或用DecimalimportjsonfromdecimalimportDecimal# 方案1金额作为字符串data{price:99.90}# JSON中是字符串price_strjson.loads({price: 99.90})[price]print(price_str)# 99.90 保持原样# 方案2用parse_float参数解析为Decimaldatajson.loads({price: 99.90},parse_floatDecimal)print(data[price])# Decimal(99.90)# 方案3大整数用parse_int# JavaScript的JSON.parse对超大整数会丢精度# Python的json模块默认不会但序列化为字符串时要注意big_num123456789012345678901234567890data{id:big_num}# json.dumps会正确序列化大整数json_strjson.dumps(data)# {id: 123456789012345678901234567890}坑四嵌套JSON取值时KeyError现象取data[user][name]时报KeyError: user因为user键不存在。解决用安全取值# 方案1逐层getnamedata.get(user,{}).get(name,未知)# 方案2try-excepttry:namedata[user][name]except(KeyError,TypeError):name未知# 方案3封装安全取值函数见前面的 safe_getdefsafe_get(data,*keys,defaultNone):forkeyinkeys:ifisinstance(data,dict):datadata.get(key,default)elifisinstance(data,list)andisinstance(key,int):if0keylen(data):datadata[key]else:returndefaultelse:returndefaultreturndata# 使用namesafe_get(data,user,name,default未知)citysafe_get(data,user,address,city,default未知)first_tagsafe_get(data,tags,0,default)
影刀RPA JSON文件处理:读写与嵌套解析
发布时间:2026/7/10 1:11:16
影刀RPA JSON文件处理读写与嵌套解析署名林焱什么情况用什么RPA流程中大量使用JSON——API返回数据、配置文件、网页数据交互。掌握JSON的读写和嵌套解析是处理API数据的必备技能。场景推荐函数特点读取JSON文件json.load文件读取JSON字符串转字典json.loads字符串解析字典转JSON字符串json.dumps序列化写入JSON文件json.dump文件写入怎么做一基础读写importjson# 写入JSON文件config{site_url:https://example.com,max_retries:3,timeout:30,headers:{User-Agent:Mozilla/5.0,Accept:application/json},targets:[首页,产品页,关于我们]}withopen(rD:\config\settings.json,w,encodingutf-8)asf:# ensure_asciiFalse: 中文不转义为\uXXXX# indent2: 格式化缩进json.dump(config,f,ensure_asciiFalse,indent2)# 读取JSON文件withopen(rD:\config\settings.json,r,encodingutf-8)asf:configjson.load(f)print(config[site_url])print(config[headers][User-Agent])print(config[targets][0])二字符串与JSON互转拼多多店群自动化上架方案importjson# JSON字符串 → Python字典解析API响应api_response{code: 0, data: {name: 张三, age: 28}, message: success}resultjson.loads(api_response)print(result[code])# 0print(result[data][name])# 张三print(result[data][age])# 28# Python字典 → JSON字符串构造API请求体request_data{action:search,filters:{category:电子产品,price_min:100,price_max:5000}}json_strjson.dumps(request_data,ensure_asciiFalse)print(json_str)三嵌套JSON解析importjson# 复杂嵌套JSONapi_data{status:ok,results:[{id:1,name:商品A,price:99.9,tags:[热销,新品],seller:{name:XX旗舰店,rating:4.8,address:{city:杭州,district:西湖区}}},{id:2,name:商品B,price:199.0,tags:[推荐],seller:{name:YY专营店,rating:4.5,address:{city:上海,district:浦东新区}}}]}# 安全取值函数避免KeyErrordefsafe_get(data,*keys,defaultNone):安全获取嵌套字典的值forkeyinkeys:ifisinstance(data,dict):datadata.get(key,default)else:returndefaultreturndata# 提取所有商品信息foriteminapi_data[results]:namesafe_get(item,name)pricesafe_get(item,price)sellersafe_get(item,seller,name)citysafe_get(item,seller,address,city)tagssafe_get(item,tags,default[])print(f商品:{name}, 价格:{price}, 卖家:{seller}, 城市:{city}, 标签:{tags})四JSON配置管理importjsonimportosfromdatetimeimportdatetimeclassJsonConfig:JSON配置文件管理器def__init__(self,config_path):self.pathconfig_path self.data{}self.load()defload(self):加载配置ifos.path.exists(self.path):withopen(self.path,r,encodingutf-8)asf:self.datajson.load(f)else:self.data{}returnself.datadefsave(self):保存配置os.makedirs(os.path.dirname(self.path),exist_okTrue)withopen(self.path,w,encodingutf-8)asf:json.dump(self.data,f,ensure_asciiFalse,indent2)defget(self,key,defaultNone):获取值支持点分隔的路径a.b.ckeyskey.split(.)valueself.dataforkinkeys:ifisinstance(value,dict):valuevalue.get(k,default)else:returndefaultreturnvalueifvalueisnotNoneelsedefaultdefset(self,key,value):设置值支持点分隔的路径keyskey.split(.)dataself.dataforkinkeys[:-1]:ifknotindata:data[k]{}datadata[k]data[keys[-1]]value self.save()defupdate(self,dict_data):批量更新self.data.update(dict_data)self.save()# 使用configJsonConfig(rD:\config\flow_config.json)# 读取支持点路径urlconfig.get(api.base_url,https://default.com)timeoutconfig.get(api.timeout,30)# 写入config.set(api.base_url,https://api.example.com)config.set(api.timeout,15)config.set(last_run,datetime.now().strftime(%Y-%m-%d %H:%M))完整流程API数据解析保存importjsonimportosfromdatetimeimportdatetime# yd_input: api_response (JSON字符串), output_dirapi_responseyd_input.get(api_response,{})output_diryd_input.get(output_dir,rD:\数据\API结果)# 解析API响应try:datajson.loads(api_response)exceptjson.JSONDecodeErrorase:yd_output{status:error,message:fJSON解析失败:{e}}else:# 提取数据results[]ifisinstance(data,dict):# 单个对象ifdataindata:itemsdata[data]ifisinstance(items,list):foriteminitems:results.append({id:item.get(id),name:item.get(name,),price:item.get(price,0),stock:item.get(stock,0),status:item.get(status,unknown)})elifisinstance(items,dict):results.append({id:items.get(id),name:items.get(name,),price:items.get(price,0),})elifisinstance(data,list):# 直接是数组foritemindata:ifisinstance(item,dict):results.append({id:item.get(id),name:item.get(name,),price:item.get(price,0),})# 保存结果os.makedirs(output_dir,exist_okTrue)timestampdatetime.now().strftime(%Y%m%d_%H%M%S)output_pathos.path.join(output_dir,fapi_result_{timestamp}.json)withopen(output_path,w,encodingutf-8)asf:json.dump({fetch_time:timestamp,count:len(results),data:results},f,ensure_asciiFalse,indent2)yd_output{status:ok,count:len(results),output:output_path}有什么坑坑一JSON中的中文被转义成\uXXXX现象写入JSON文件后中文变成了\u5f20\u4e09这种形式。原因json.dumps默认ensure_asciiTrue会把非ASCII字符转义。解决设置ensure_asciiFalseimportjson data{name:张三,city:北京}# 正确中文正常显示json_strjson.dumps(data,ensure_asciiFalse)print(json_str)# {name: 张三, city: 北京}# 错误中文被转义# json_str json.dumps(data) ❌# {name: \u5f20\u4e09, city: \u5317\u4eac}# 写入文件时也要加withopen(data.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)坑二JSON解析失败格式错误现象json.loads报JSONDecodeError: Expecting property name enclosed in double quotes。原因JSON规范要求键名和字符串值必须用双引号不能用单引号。Python字典可以用单引号但JSON不行。解决TEMU店群如何管理运营importjson# 正确的JSON双引号datajson.loads({name: 张三, age: 28})# 错误单引号不是合法JSON# data json.loads({name: 张三, age: 28}) ❌# 如果数据源用了单引号比如Python repr输出需要先替换bad_json{name: 张三, age: 28}fixed_jsonbad_json.replace(,)try:datajson.loads(fixed_json)except:# 更安全的方式用ast.literal_eval解析Python字面量importast dataast.literal_eval(bad_json)坑三JSON中数值精度丢失现象API返回的金额是99.90解析后变成了99.9。或者大整数丢失精度。原因JSON的数字类型在Python中被解析为float或intfloat会有精度问题。解决金额用字符串传输或用DecimalimportjsonfromdecimalimportDecimal# 方案1金额作为字符串data{price:99.90}# JSON中是字符串price_strjson.loads({price: 99.90})[price]print(price_str)# 99.90 保持原样# 方案2用parse_float参数解析为Decimaldatajson.loads({price: 99.90},parse_floatDecimal)print(data[price])# Decimal(99.90)# 方案3大整数用parse_int# JavaScript的JSON.parse对超大整数会丢精度# Python的json模块默认不会但序列化为字符串时要注意big_num123456789012345678901234567890data{id:big_num}# json.dumps会正确序列化大整数json_strjson.dumps(data)# {id: 123456789012345678901234567890}坑四嵌套JSON取值时KeyError现象取data[user][name]时报KeyError: user因为user键不存在。解决用安全取值# 方案1逐层getnamedata.get(user,{}).get(name,未知)# 方案2try-excepttry:namedata[user][name]except(KeyError,TypeError):name未知# 方案3封装安全取值函数见前面的 safe_getdefsafe_get(data,*keys,defaultNone):forkeyinkeys:ifisinstance(data,dict):datadata.get(key,default)elifisinstance(data,list)andisinstance(key,int):if0keylen(data):datadata[key]else:returndefaultelse:returndefaultreturndata# 使用namesafe_get(data,user,name,default未知)citysafe_get(data,user,address,city,default未知)first_tagsafe_get(data,tags,0,default)