本文正在参加「金石计划 . 分割6万现金大奖」

前语

【PY】重整 JSON 映射

大致意思就是说,将原先的 JSON 文件提取部分内容后进行从头映射,形成新的 JSON 文件;

本篇博文是面向 Python 初学者的,内容比较根底;

什么是 JSON?

让咱们先来了解一下 JSON 是什么?

JSON(JavaScriptObject Notation, JS 目标简谱)是一种轻量级的数据交流格式。它基于ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的 js 规范)的一个子集,选用彻底独立于编程言语的文本格式来存储和表明数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交流言语。 易于人阅览和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

JSON 可用于 JavaScript 程序,而无需任何解析或序列化。它是针对 JavaScript 目标文字、数组和标量数据的一种基于文本的表明方式。

JSON 相对易于读写,同时也便于软件解析和生成。它一般用于序列化、结构化数据并通过网络进行交流,一般发生在服务器与 Web 应用之间。

在细粒度级别,JSON 由数据类型组成。

  1. 字符
  2. 数字
  3. 布尔值
  4. Null
  5. 目标
  6. 数组

字符串

JSON 中的字符串由 Unicode 字符组成,并包括反斜杠 \ 转义。

示例

{ "name" : "Jones" }

数字

JSON 数字遵循 JavaScript 的双精度浮点格式。

示例

{
  "number_1" : 210,
  "number_2" : 215,
  "number_3" : 21.05,
  "number_4" : 10.05
}

布尔值

布尔值被指定为truefalse。布尔值并不包括在引号内,而是被视为字符串值。

示例

{ "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())

【PY】重整 JSON 映射

然后依据咱们之前整理的映射关系,转换成代码:

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)

【PY】重整 JSON 映射

最后看看成果:

【PY】重整 JSON 映射

跋文

以上就是 重整 JSON 映射 的全部内容了,希望我们有所收获!

上篇精讲:【PY】依据 Excel 中的指示修正 JSON 数据

我是,等待你的关注;

创作不易,请多多支持;

系列专栏:PY