Google Takeout 里的 JSON 文件是什么?能删吗?
Google Takeout 导出的每张照片旁边都有一个 .json 文件。它里面装着什么,为什么会有,什么时候可以安全删除。
你解压了 Google 相册的导出包,发现一半的文件不是照片。每张图片旁边都躺着一个 .json 文件,名字像 IMG_3391.HEIC.supplemental-metadata.json。你没要过这些东西,大多数软件打不开,而且有几千个。
它们不是垃圾。里面装着 Google 没有写进照片的拍摄日期和拍摄地点。
Google 为什么要加这些文件
Google 相册把它知道的关于一张照片的所有信息存在自己的数据库里:什么时候拍的、在哪拍的、属于哪个相册、有没有加星标,以及你手动改过的日期和地点。图片文件本身的 EXIF 区块可能有这些信息,也可能没有。截图和聊天图片通常没有。你在 Google 相册里做的修改,从来不会写进文件。
导出时,Google 把图片文件基本按上传时的原样交还给你。它不把数据库里的记录写回每个文件,而是把这条记录倒进图片旁边的一个小文本文件里。这个文本文件就是所谓的「附属文件」(sidecar),JSON 只是它的书写格式。
里面有什么
用记事本、文本编辑或任何代码编辑器打开一个。典型的内容略作删减后是这样:
{
"title": "IMG_3391.HEIC",
"description": "",
"imageViews": "12",
"creationTime": {
"timestamp": "1690120442",
"formatted": "Jul 23, 2023, 2:34:02 PM UTC"
},
"photoTakenTime": {
"timestamp": "1689929130",
"formatted": "Jul 21, 2023, 9:25:30 AM UTC"
},
"geoData": {
"latitude": 39.9163,
"longitude": 116.3972,
"altitude": 45.0,
"latitudeSpan": 0.0,
"longitudeSpan": 0.0
},
"geoDataExif": {
"latitude": 39.9163,
"longitude": 116.3972,
"altitude": 45.0
},
"url": "https://photos.google.com/photo/...",
"googlePhotosOrigin": {
"mobileUpload": {
"deviceType": "IOS_PHONE"
}
}
}
重要的字段:
photoTakenTime 是拍摄时间,也就是 Google 相册里显示的那个时间。timestamp 是从 1970 年 1 月 1 日起的秒数,UTC。如果你在 Google 相册里改过日期,这里存的就是改过的值。要用的是这个字段。
creationTime 是文件上传到 Google 的时间。当天拍当天备份的照片,两者一样。1985 年的冲印照片 2021 年扫描上传,两者差几十年。
geoData 是 Google 相册记录的位置,包括你手动设置的地点。geoDataExif 是上传时文件自带 EXIF 里的位置。照片没有位置信息时,两个字段都是零:0.0, 0.0,那是大西洋上的一个点。把全零当成「未知」,而不是真实地点。详见Takeout 照片没有位置信息。
description 是你写的说明文字,如果有的话。people 列出你标记过的人名。favorited 为 true 表示加过星标。title 是原始文件名,这个字段有用,因为 Takeout 有时会缩短实际的文件名。
相册文件夹里的 metadata.json
每个相册文件夹里还有一个 metadata.json,描述的是相册本身,不是某张照片。里面有相册标题,有时还有日期和共享标记。文件很小,没有害处。导入相册的工具,比如 immich-go,会读它。
为什么名字这么奇怪
早期的导出把附属文件叫 IMG_3391.HEIC.json。从 2024 年起改成了 IMG_3391.HEIC.supplemental-metadata.json。Google 还会把过长的附属文件名截断到 46 个字符,所以 Pixel 手机的照片会配上一个叫 PXL_20230721_092530123.jpg.supplemental-m.json 的文件。两张照片重名时,序号在附属文件名里的位置也不一样:IMG_3391(1).HEIC 配的是 IMG_3391.HEIC.supplemental-metadata(1).json。细节见 supplemental-metadata.json 详解。
可以删吗
可以,但要先用完再删。如果先删了附属文件,里面的日期和位置就没了。你的照片会永远显示成下载日期,除了重新跑一遍 Takeout,没有别的办法找回来。
如果你的照片本来就都有完好的 EXIF,附属文件的作用不大。可以用 exiftool 检查:exiftool -r -if 'not $DateTimeOriginal' -filename . 会列出所有缺 EXIF 日期的照片。列表是空的,就放心删。
大多数相册的列表不是空的。安全的顺序是:先把附属文件的数据合并进照片,抽查几张,再删 .json 文件。Immich、PhotoPrism 和一些自建相册工具能在导入时直接读 Takeout 的附属文件,如果你要去那里,就留到导入完成。
把数据写回照片
可以用 exiftool 做,它读附属文件然后写 EXIF 标签。命令和坑见 exiftool 修复指南。GooglePhotosTakeoutHelper 这类免费脚本也是同样的思路。
Takeout JSON Metadata Fixer 把这件事做成了桌面软件,支持 Windows、Linux 和 Mac。
它读每一个附属文件,把 photoTakenTime 写进照片的 EXIF,把文件时间改成一致,并在 GPS 坐标是真实值而不是零的时候把坐标写回去。它认识两种附属文件命名方式、截断的文件名和 (1) 序号,所以不会像固定文件名模式那样漏掉文件。可以选择给照片重命名并整理进文件夹,也可以在输出旁边重新生成干净的 .json 附属文件,给 Immich 或 PhotoPrism 用。全部在你的电脑上运行。前 1000 张照片免费。
常见问题
每张照片都有一个 JSON 吗?
通常是。出现在多个相册里的照片,每个相册文件夹里都有一份附属文件。少数照片完全没有附属文件,最常见的是实况照片的视频片段和很早以前上传的文件。这些照片保留文件里原有的日期。
Google 相册自己能读回这些文件吗?
不能。把文件夹再上传回 Google 相册,它会忽略附属文件,只用文件里的 EXIF。这就是为什么在两个 Google 账号之间搬照片也会丢日期。
时间戳是我的时区吗?
不是。它们是 UTC 时刻。工具写 EXIF 时会按你电脑的时区换算成本地时间。确认电脑时区设成了大多数照片的拍摄地。
JSON 文件占很多空间吗?
每个几百字节到几 KB。一万个大约 10 MB。删它们不是为了省空间,是为了清爽。