in Programming, Python

Python3操作Json文件碰到的几个问题

小结

使用Python3操作Json文件碰到的几个问题,进行了解决。

问题及解决

byte数组与str字符串之间不兼容

以下的几个问题都是由于字节数组和字符串之间类型不匹配导致的问题:
– TypeError: can’t concat str to bytes

  • TypeError: keys must be str, int, float, bool or None, not bytes
  • TypeError: a bytes-like object is required, not ‘str’

  • Invalid type for parameter LoadBalancerArn, value: b’arn:aws:elasticloadbalancing:ap-southeast-1:123456789012:loadbalancer/app/spring-petclinic-rest-elb/8616ff3572df2ed3′, type: , valid types:

一般由以下几个办法解决:
– 如果是byte数组,需要转化为字符串,尝试使用以下办法byte_array_to_convert.decode("utf-8") 或者 str(byte_array_to_convert.decode("utf-8"))

  • 如果是字符串,想要转换为byte数组,尝试使用以下办法str_convert_to_byte_array.encode('utf-8')

没有Index属性

错误如下:
– AttributeError: ‘dict_keys’ object has no attribute ‘index’

解决办法,实际上是把这个变量转化为list类型,例如:

Name=project_name + str(list(service_list.keys()).index(service)) + '-tg'

JSON.DUMP(S) & JSON.LOAD(S)

以下是一个示例:

#!/bin/python
import json

home = expanduser("~")
filename = home + '/.docker/config.json'
with open(filename, 'r+') as f:
  data = json.load(f)
  data["auths"] = {
    hostname.decode("utf-8"): {
      "auth": ecr_login_token.decode("utf-8")
    }
  }
  f.seek(0)
  f.write(json.dumps(data, indent=4))
  f.truncate()

其中indent=4是对Json文件进行美化。

参考

stackoverflow: json.dump() gives me “TypeError: keys must be a string”
JSON.DUMP(S) & JSON.LOAD(S)
Python.org: json — JSON encoder and decoder
stackoverflow: Convert bytes to a string in Python 3
Python JSON Pretty Print | Guide (With Examples)
stackoverflow: “TypeError: a bytes-like object is required, not ‘str'” when handling file content in Python 3