从 JavaScript 角度学 Python(19) - JSON

前言

前面我们了解基本的档案处理之後,接下来当然就是试着实作读取一些不同格式的档案,因此这一篇将会介绍我们前端工程师常用的 JSON 档案。

JSON

对於一名前端工程师来讲,相信 JSON (JavaScript Object Notation) 应该不会很陌生,但是如果你不清楚 JSON 的背景以及它的一些细节的话,那麽建议你可以阅读我先前写的这一篇「JavaScript 核心观念(32)-物件-JSON」文章先稍微回顾恶补一下。

你看完了吗?不,我相信你没看。

https://ithelp.ithome.com.tw/upload/images/20210918/201194865AbjZy0Qry.png

前面开玩笑的,我说的是在场都是...(被揍)

那麽为了确保接下来的动作都正确,所以前面我还是简单介绍一下关於 JSON 的部分。

首先先让我们看一段简易的 JSON 格式:

{
  "keyID": 0,
  "blogList": [
    {
      "title": "PixiJS V5 教学 (0)",
      "url": "https://hsiangfeng.github.io/javascript/20200203/3949702627/"
    },
  ],
  "updateTime": "2020/2/18 下午 7:49:36",
  "blogUrl": "https://hsiangfeng.github.io/",
  "name": "Ray"
}

发现了吗?上面的 JSON 范例可以发现与 Python 的字典非常相像,这边我也拉一个先前的 Python 字典范例给大家比较看看:

dic = {
  'name': 'Ray',
}

可以发现单纯只是双引号变成单引号而已,甚至你把整个 JSON 拉过来 Python 运作都不会出现任何错误:

json = {
  "keyID": 0,
  "blogList": [
    {
      "title": "PixiJS V5 教学 (0)",
      "url": "https://hsiangfeng.github.io/javascript/20200203/3949702627/"
    },
  ],
  "updateTime": "2020/2/18 下午 7:49:36",
  "blogUrl": "https://hsiangfeng.github.io/",
  "name": "Ray"
}

print(json) # is working!

这时候你可能会想说「所以我可以这样写入一个 JSON 格式罗?!」

身为工程师必须要有实验的精神,因此这边你可以试着输入以下程序码看看结果会怎麽样:

dic = {
  "keyID": 0,
  "blogList": [
    {
      "title": "PixiJS V5 教学 (0)",
      "url": "https://hsiangfeng.github.io/javascript/20200203/3949702627/"
    },
  ],
  "updateTime": "2020/2/18 下午 7:49:36",
  "blogUrl": "https://hsiangfeng.github.io/",
  "name": "Ray"
}

f = open('example.json', 'w')
f.write(dist)
f.close()

你尝试了吗?如果你有尝试上面范例程序码的话,你应该会出现这一段 TypeError: write() argument must be str, not dict 错误讯息。

最主要原因是 write 只接受纯粹的 String 格式,此时异想天开的你或许会想说「那我就用 str 型别转换就好了呀?」,实际上是不行的,如果你用这种方式的话,结果会变成一个错误的 JSON 格式:

{'keyID': 0, 'blogList': [{'title': 'PixiJS V5 教学 (0)', 'url': 'https://hsiangfeng.github.io/javascript/20200203/3949702627/'}], 'updateTime': '2020/2/18 下午 7:49:36', 'blogUrl': 'https://hsiangfeng.github.io/', 'name': 'Ray'}

奇妙吧?毕竟你要知道一件事情 JSON 是 JavaScript 的子集(意指参照基於 JavaScript 延伸出来的),因此对於 JavaScript 的相容性会是最好的,因此如果你要用於 Python 的话,则必须使用另一个东西来处理。

https://ithelp.ithome.com.tw/upload/images/20210918/20119486J9PTFAQV61.jpg

JSON 模组

这边先拉回到 JavaScript 的角度来简单聊一下,通常我们在储存一些资料到 localStorage 时都会搭配使用 JSON.stringify,而从 localStorage 拉出资料到 JavaScript 中就会使用 JSON.parse 来转换回原本的 JavaScript 物件:

const a = {
  keyID: 0,
  blogList: [
    {
      title: "PixiJS V5 教学 (0)",
      url: "https://hsiangfeng.github.io/javascript/20200203/3949702627/"
    }
  ],
  updateTime: "2020/2/18 下午 7:49:36",
  blogUrl: "https://hsiangfeng.github.io/",
  name: "Ray"
}

localStorage.setItem('test', JSON.stringify(a)); // 储存

JSON.parse(localStorage.getItem('test'))// 取出

那麽本身 Python 如果想要处理 JSON 格式的话,就必须引入 Python 的 JSON 模组:

import json

其中 JSON 模组中有 dumps 方法可以将 Python 的 dict 型别转换成 JSON 格式,写法与用法也相当的简易,让我们来看一下:

import json

dic = {
  "keyID": 0,
  "blogList": [
    {
      "title": "PixiJS V5 教学 (0)",
      "url": "https://hsiangfeng.github.io/javascript/20200203/3949702627/"
    },
  ],
  "updateTime": "2020/2/18 下午 7:49:36",
  "blogUrl": "https://hsiangfeng.github.io/",
  "name": "Ray"
}



f = open('example.json', 'w')
f.write(json.dumps(dic))
f.close()

发现了吗?你可以正常的写入一个 JSON 格式了呢!而且不会出现任何错误!

https://ithelp.ithome.com.tw/upload/images/20210918/20119486sT1eTJ7nY2.png

那麽反之读取呢?虽然你可以直接这样子读取 JSON 格式:

f = open('example.json', 'r')
read = f.read()
f.close()
print(read)

但是如果你要拿 JSON 格式的资料做一些处理的话,就必须使用 JSON 模组来转换成 Python 可以读的型别,否则 f.read() 出来的档案型别会是一个 str(字串):

f = open('example.json', 'r')
read = f.read()
f.close()
print(type(read)) # str

那你可能会想说这样会有什麽问题吗?通常我们将 JSON 读取後,可能会需要使用它某个栏位的属性,那麽如果不透过 JSON 模组处理的话,你是无法取得特定属性的,毕竟一整个都是一个 str 型别:

f = open('example.json', 'r')
read = f.read()
f.close()
print(type(read))
print(read['name']) # TypeError: string indices must be integers

因此当你取得 JSON 格式後,请记得使用 JSON 模组转换成 Python 可以读懂的型别:

import json

f = open('example.json', 'r')
read = f.read()
f.close()
print(type(read))
data = json.loads(read)
print(data['name']) # Ray

所以其实可以发现 JSON 格式的资料,不管是在 JavaScript 还是 Python 中都是必须额外处理的唷。

作者的话

因为家里的人说喜欢我做的花雕醉鸡...所以又跑去买了新的酒回来,但是这次打算尝试制作绍兴醉鸡试试看,或许味道也不错?!

关於兔兔们

兔法无边


<<:  Day 5 如何撰写Odoo程序 (以Compute为例)

>>:  Episode 5 - 输入与输出

Day 25 Figma 设计档的多啦时光机 - 档案历史纪录与版本控制

大家应该都有这样的经验:辛辛苦苦做了一、二个小时的进度,因为没有养成随时存档的好习惯,当突然遇到软件...

Day 8 - Functional Programming 初探 (1) - HoF 与 Side Effects

前言 Functional Programming 其实是我相对不熟的主题,但因为在写一些较难的程序...

[JS] You Don't Know JavaScript [Scope & Closures] - The Module Pattern

前言 在本章节中将介绍这本书最重要的程序组织之一,module,module会用到我们之前所介绍的所...

更新网格机器人和策略回测

Gridbot: 1.debugmode的检查新增部位超过上限的部分 2.针对凌晨时段交割金和帐户余...

IT 铁人赛 k8s 入门30天 -- day13 Deploying Stateful Apps with StatefulSet

前言 今天主要会介绍 StatefulSet 以及比较其与 Deployment 的不同 State...