本文正在参加「金石计划 . 分割6万现金大奖」
前语
大致意思就是说,将原先的 JSON 文件提取部分内容后进行从头映射,形成新的 JSON 文件;
本篇博文是面向 Python 初学者的,内容比较根底;
什么是 JSON?
让咱们先来了解一下 JSON 是什么?
JSON(JavaScriptObject Notation, JS 目标简谱)是一种轻量级的数据交流格式。它基于ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的 js 规范)的一个子集,选用彻底独立于编程言语的文本格式来存储和表明数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交流言语。 易于人阅览和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 可用于 JavaScript 程序,而无需任何解析或序列化。它是针对 JavaScript 目标文字、数组和标量数据的一种基于文本的表明方式。
JSON 相对易于读写,同时也便于软件解析和生成。它一般用于序列化、结构化数据并通过网络进行交流,一般发生在服务器与 Web 应用之间。
在细粒度级别,JSON 由数据类型组成。
- 字符串
- 数字
- 布尔值
- Null
- 目标
- 数组
字符串
JSON 中的字符串由 Unicode 字符组成,并包括反斜杠 \
转义。
示例
{ "name" : "Jones" }
数字
JSON 数字遵循 JavaScript 的双精度浮点格式。
示例
{
"number_1" : 210,
"number_2" : 215,
"number_3" : 21.05,
"number_4" : 10.05
}
布尔值
布尔值被指定为true
或false
。布尔值并不包括在引号内,而是被视为字符串值。
示例
{ "AllowPartialShipment" : false }
Null
Null 是一个空值。当没有分配给键的值时,能够将其视为 null
值。
示例
{ "Special Instructions" : null }
目标
JSON 目标数据类型是 {}
(花括号)之间插入的一系列称号或值对。键有必要是字符串,而且应当是唯一的,以逗号分隔。
示例
{
"Influencer" : { "name" : "Jaxon" , "age" : "42" , "city" , "New York" }
}
数组
数组数据类型是值的有序集合。在 JSON 中,数组值有必要是字符串、数字、目标、数组、布尔值或null
。
示例
{
"Influencers" : [
{
"name" : "Jaxon",
"age" : 42,
"Works At" : "Tech News"
}
{
"name" : "Miller",
"age" : 35
"Works At" : "IT Day"
}
]
}
剖析并重整映射
接下来咱们剖析一下 JSON 文件的映射关系:
old.json
{
"image_name": "2021_12_08_031723_2021_12_08_031723_frame_0.png",
"region": [
{
"id": 1,
"type": "boundingBox",
"imageName": "2021_12_08_031723_2021_12_08_031723_frame_0.png",
"layer": "layer1",
"tags": [
{
"labelText": "咖啡渍",
"label": "category",
"value": "coffee stain"
}
],
"groupId": null,
"errorNews": "",
"errorType": "",
"coordinates": {
"class": "液态污渍",
"name": "liquid stain",
"bbox": [
635.8563570626424,
1025.9144852369077,
190.29187232693363,
79.67239401234526
]
},
"version": "1.0"
},
{
"id": 2,
"type": "boundingBox",
"imageName": "2021_12_08_031723_2021_12_08_031723_frame_0.png",
"layer": "layer1",
"tags": [
{
"labelText": "床单、沙发布",
"label": "category",
"value": "bed sheets、sofa fabric"
}
],
"groupId": null,
"errorNews": "",
"errorType": "",
"coordinates": {
"class": "沙发布",
"name": "sofa fabric",
"bbox": [
0.282695423313049,
0.7645605412412289,
1133.0149454408931,
1083.8061147185742
]
},
"version": "1.0"
}
],
"global": [
{
"label": "房间种类",
"value": "livingroom"
},
{
"label": "地板类型",
"value": "Wood"
}
],
"file": {
"fid": "1597840648127737857",
"src": "1597840302806495233/2022.11.22/2021_12_08_031723_2021_12_08_031723_frame_0.png",
"name": "2021_12_08_031723_2021_12_08_031723_frame_0.png",
"scaleHistory": [],
"isSeen": true,
"version": [],
"isChange": true
}
}
new.json
{
"shapes": [
{
"label": "liquid stain",
"labelText": "coffee stain",
"points": [
{
"x": 635,
"y": 1025
},
{
"x": 190,
"y": 79
}
]
},
{
"label": "sofa fabric",
"labelText": "bed sheets、sofa fabric",
"points": [
{
"x": 0,
"y": 0
},
{
"x": 1133,
"y": 1083
}
]
}
],
"imagePath": "2021_12_08_031723_2021_12_08_031723_frame_0.png",
"imageHeight": 1200,
"imageWidth": 1600,
"imageScene": [
"livingroom"
],
"floorMaterial": "Wood"
}
咱们先处理一下比较简单的映射关系:
-
image_name
->imagePath
; -
global[0]['value']
->imageScene
; -
global[1]['value']
->floorMaterial
; -
imageHeight
-> 1200; -
imageWidth
-> 1600;
然后接下来再来看 shapes
键对应的值,值的类型是数组,其中每个元素都是字典类型的,这样咱们就持续来处理一下映射,能够发现 shapes
中的内容与原先的 JSON 文件中的 region
键有所相关:
-
region[0]['coordinates']['name']
->shapes[0]['label']
-
region[0]['tags']['value']
->shapes[0]['labelText']
-
region[0]['coordinates']['bbox']
->shapes[0]['points']
完结剖析之后,咱们就开端上手代码;
代码实战
导入 json 包,并导入 json 文件:
import json
with open("old.json", "r") as f:
content = json.loads(f.read())
然后依据咱们之前整理的映射关系,转换成代码:
new_content = {"shapes": [], "imagePath": content['image_name'],
"imageHeight": 1200, "imageWidth": 1600,
"imageScene": [content['global'][0]['value']],
"floorMaterial": content['global'][1]['value']
}
for it in content['region']:
bbox = it['coordinates']['bbox']
it_content = {"label": it['coordinates']['name'],
"labelText": it['tags'][0]['value'],
"points": [
{"x": int(bbox[0]), "y": int(bbox[1])},
{"x": int(bbox[2]), "y": int(bbox[3])}
]}
new_content['shapes'].append(it_content)
print(it_content)
最后看看成果:
跋文
以上就是 重整 JSON 映射 的全部内容了,希望我们有所收获!
上篇精讲:【PY】依据 Excel 中的指示修正 JSON 数据
我是,等待你的关注;
创作不易,请多多支持;
系列专栏:PY