Takeout JSON

Google Takeout の写真についてくる JSON ファイルとは?中身と削除してよいタイミング

Google フォトのエクスポートで写真ごとに付いてくる .json ファイルの中身、photoTakenTime や geoData の意味、なぜ存在するのか、名前が妙な理由、そしていつ削除して安全なのかを説明します。削除するのは書き戻してからです。

Google フォトのエクスポートを解凍したら、ファイルの半分が写真ではなかった。写真の横に IMG_3391.HEIC.supplemental-metadata.json のような名前の .json ファイルが並んでいる。頼んだ覚えはなく、たいていのソフトでは開けず、しかも何千個もある。

これはゴミではありません。Google が写真の中に書き込まなかった撮影日と位置情報が、ここに入っています。

なぜ Google は JSON を付けるのか

Google フォトは、写真について知っていることを自社のデータベースに保存しています。いつ撮ったか、どこで撮ったか、どのアルバムに入っているか、お気に入りにしたか、手で修正した日付や場所はどれか。画像ファイル自体の EXIF にその情報があるかどうかは別問題です。スクリーンショットやチャットの画像にはたいていありません。Google フォト内で行った編集は、絶対にファイルに反映されません。

エクスポートするとき、Google はアップロードされたときのままの画像ファイルを渡します。データベースの内容を各ファイルに書き戻すことはしません。代わりに、データベースの項目を小さなテキストファイルにして写真の横に置きます。これがサイドカーファイルで、JSON はその書式の名前にすぎません。

中に何が書いてあるか

メモ帳、テキストエディット、どのコードエディターでも開けます。典型的な 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": 35.6586,
    "longitude": 139.7454,
    "altitude": 35.0,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "geoDataExif": {
    "latitude": 35.6586,
    "longitude": 139.7454,
    "altitude": 35.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 が 1 つあり、写真ではなくアルバム自体を説明しています。アルバム名、場合によっては日付と共有アルバムかどうかのフラグが入っています。小さく無害なファイルです。immich-go のようにアルバムを取り込むツールはこれを読みます。

名前が妙なのはなぜか

古いエクスポートでは IMG_3391.HEIC.json でした。2024 年から IMG_3391.HEIC.supplemental-metadata.json になっています。さらに Google は JSON の名前を 46 文字で切り詰めるので、Pixel の写真には PXL_20230721_092530123.jpg.supplemental-m.json のような相棒が付きます。同じ名前の写真が 2 枚あると、連番の付く位置が変わります。IMG_3391(1).HEIC の相手は IMG_3391.HEIC.supplemental-metadata(1).json です。詳細は supplemental-metadata.json の解説 にあります。

削除してもいいのか

はい、ただし使い終わってからです。先に JSON を消すと、そこに入っていた日付と位置情報は失われます。写真は永久にダウンロード日を表示し続け、取り戻す方法は Takeout をもう一度やり直すことしかありません。

写真すべてに正しい EXIF が入っているなら、JSON はほとんど役に立ちません。exiftool で確かめられます。exiftool -r -if 'not $DateTimeOriginal' -filename . で EXIF の撮影日がない写真が一覧されます。何も出なければ消して構いません。

ほとんどのライブラリでは、何かしら出てきます。安全な順番は、JSON の情報を写真に書き込む、何枚か確認する、それから .json を削除する、です。Immich や PhotoPrism などの自宅サーバー向けツールは取り込み時に Takeout の JSON を直接読めるので、行き先がそれらなら取り込みが終わるまで残しておいてください。

情報を写真に戻す

exiftool で JSON を読み、EXIF タグに書き込めます。コマンドと注意点は exiftool ガイド にまとめました。GooglePhotosTakeoutHelper のような無料スクリプトも同じ考え方を包んだものです。

Takeout JSON Metadata Fixer は、これをデスクトップアプリとして Windows、Mac、Linux で行います。

各 JSON を読み、photoTakenTime を写真の EXIF に書き込み、ファイル日時を合わせ、座標がゼロではなく本物なら GPS も書き込みます。両方の命名スタイル、切り詰められた名前、(1) の連番を知っているので、ファイル名のパターン照合では見落とすファイルも飛ばしません。任意で写真の名前を付け直してフォルダーに整理でき、Immich や PhotoPrism 用に出力先へ新しい .json を書き出すこともできます。すべてお使いのパソコンの中で動きます。最初の 1000 枚は無料です。

よくある質問

写真 1 枚につき JSON は 1 つですか?

普通はそうです。複数のアルバムに入っている写真は、各アルバムフォルダーに JSON のコピーがあります。JSON がまったくない写真も少しあり、Live Photos の動画部分やごく古いアップロードに多いです。それらはファイルにある日付のままになります。

Google フォト自体は JSON を読み戻せますか?

いいえ。フォルダーを Google フォトに再アップロードしても JSON は無視され、ファイル内の EXIF が使われます。別の Google アカウントに移す人が日付を失うのもこのためです。

タイムスタンプは日本時間ですか?

いいえ。UTC の瞬間です。ツールが EXIF に書き込むとき、パソコンのタイムゾーンで現地時刻に変換します。パソコンの設定が大半の写真を撮った場所になっているか確認してください。

JSON は容量を食いますか?

1 つ数百バイトから数キロバイトです。1 万個でおよそ 10 MB。削除する理由は容量ではなく、散らかりです。