Python —— JSON

一文搞懂JSON-优快云博客

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于将数据结构化地传输和存储。它由键值对组成,采用类似于JavaScript对象的格式来表示数据。JSON易于阅读和编写,并且易于解析和生成,成为广泛应用于Web应用程序和数据交换的标准格式之一;

基本数据类型
String 字符双引号包围的Unicode字符序列"hello world"
Number 数字包括整数和浮点1、3.14
Boolean 布尔值表示真或假true、false
Null 空值表示空值null
Object 对象由一组无序的键值对组成,键为字符串,值可为任意json数据类型;键值对之间使用逗号分开,整个对象使用花括号{}包围;

{
"name": name,

"value": value
        }

Array 数组由一直有序的值组成,值可为任意json数据类型;值之间使用逗号分隔,整个数组使用方括号[]包围;[1,2,3,4]
{
  "name": "southernbrid",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}

Python内置了json模块,用于处理json数据,提供了一下四个函数:

  • json.dumps(obj),将python对象转换为json字符串;
  • json.loads(json_string),将json字符串转换为python对象;
  • json.dump(obj, fp),将python对象转换为json字符串,并写入文件流;
  • json.load(fp),从文件流中读取json字符串,并转换为python对象;
//JSON序列化
import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

json_data = json.dumps(data)
print(json_data)
//json反序列化
import json

json_string = '{"name": "John", "age": 30, "city": "New York"}'

data = json.loads(json_string)
print(data)
//将json写入到文件
import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open('data.json', 'w') as fp:
    json.dump(data, fp)
//从文件读取json
import json

with open('data.json', 'r') as fp:
    data = json.load(fp)
print(data)

### Labelme生成的JSON文件转换为PNG格式标注图的方法 Labelme生成的JSON文件可以通过多种方式转换为PNG格式的标注图像。以下是几种常见方法及其代码实现: #### 方法一:使用`labelme_json_to_dataset`命令行工具 Labelme自带的命令行工具可以直接将单个或多个JSON文件转换为包含标注信息的PNG图像。以下是一个批量处理的Python脚本示例[^2]: ```python import os import os.path as osp import shutil import cv2 def json2png(json_folder, png_save_folder): if osp.isdir(png_save_folder): shutil.rmtree(png_save_folder) os.makedirs(png_save_folder) json_files = os.listdir(json_folder) for json_file in json_files: json_path = osp.join(json_folder, json_file) os.system("labelme_json_to_dataset {}".format(json_path)) label_path = osp.join(json_folder, json_file.split(".")[0] + "_json/label.png") png_save_path = osp.join(png_save_folder, json_file.split(".")[0] + ".png") label_png = cv2.imread(label_path, 0) label_png[label_png > 0] = 255 cv2.imwrite(png_save_path, label_png) if __name__ == '__main__': json_dir = "path/to/json/folder" # JSON文件所在文件夹 label_dir = "path/to/save/png/folder" # 转换后的PNG文件保存路径 json2png(json_folder=json_dir, png_save_folder=label_dir) ``` 上述代码通过调用`labelme_json_to_dataset`命令,将每个JSON文件转换为一个临时文件夹中的`label.png`,然后将其复制到指定的目标文件夹中,并将非零像素值设置为255以生成黑白掩码图像。 #### 方法二:直接解析JSON文件并绘制多边形 如果需要自定义转换逻辑,可以手动解析JSON文件并使用PIL库绘制多边形。以下是一个示例代码[^4]: ```python import json from PIL import Image, ImageDraw import os # 定义文件夹路径 folder_path = 'path/to/json/folder' # 遍历文件夹中的所有文件 for filename in os.listdir(folder_path): if filename.endswith('.json'): # 确保是JSON文件 file_path = os.path.join(folder_path, filename) # 读取JSON文件 with open(file_path, 'r') as f: data = json.load(f) # 获取图像的宽度和高度 image_width = data['imageWidth'] image_height = data['imageHeight'] # 创建一个新图片,假设图片大小是imageWidth x imageHeight,背景为黑色 image = Image.new('RGB', (image_width, image_height), 'black') draw = ImageDraw.Draw(image) # 遍历shapes,找到label为特定类别的多边形 for shape in data['shapes']: if shape['label'] == 'target_class': # 替换为目标类别名称 points = shape['points'] polygons = [(int(x[0]), int(x[1])) for x in points] draw.polygon(polygons, fill='white') # 保存图片 png_filename = os.path.splitext(filename)[0] + '.png' image.save(os.path.join(folder_path, png_filename)) ``` 此方法允许用户根据具体需求调整标签类别和绘制逻辑。 #### 方法三:修改Labelme源码以支持特殊编码的JSON文件 在某些情况下,JSON文件可能包含特殊字符编码(如`gb18030`)。此时可以通过修改Labelme的源码来兼容这些文件[^3]。具体步骤如下: 1. 查找Labelme安装路径(例如`D:\program\conda_1\envs\py39_torch\Lib\site-packages\labelme\cli`)。 2. 修改`json_to_dataset.py`文件中的第39行,将`data = json.load(open(json_file))`替换为`data = json.load(open(json_file, encoding='gb18030', errors='ignore'))`。 3. 使用以下代码批量转换JSON文件: ```python import os import glob if __name__ == '__main__': path = './path/to/json/files' # JSON文件所在文件夹路径 for json in os.listdir(path): if json.endswith('.json'): json_file = glob.glob(os.path.join(path, json)) for filename in json_file: os.system("labelme_json_to_dataset.exe %s" % (filename)) print(f"{filename} done") ``` #### 注意事项 - 在运行上述代码之前,请确保已正确安装Labelme及相关依赖项[^1]。 - 如果JSON文件数量较多,建议使用批处理脚本以提高效率。 - 根据实际需求调整代码中的类别名称(如`'wood'`或`'target_class'`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值