GIG

赴くままに技術を。

APIで取得したjsonが文字化けする

備忘録としてメモ。 やりたいことは、REST API提供されているデータを取得して、保存することです。

また使用しているpythonの環境は、以下。

 python --version
Python 3.4.3 :: Anaconda 2.2.0 (x86_64)

使用するデータは、e-StatのAPIから取得します。 APIを使用するに歳しては、まずユーザ登録をして、アプリケーションIDを発行しなくてはなりません。

www.e-stat.go.jp

提供されている機能としては5種類あります。 主に使いそうなものとしては、下記の2点になるかと思います。

  1. 使いたいデータの政府統計コードを使って、「統計表情報取得」機能から利用したい統計表IDを取得
  2. 「統計データ取得」機能からデータを取得

今回は、2点目の機能を利用。 平成22年国税調査 速報集計(0003033021)を例として、取得してみました。

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import urllib.request, urllib.parse
import json, sys

def getEStatData():
    jsonUrl = "http://api.e-stat.go.jp/rest/2.0/app/json"
    apiKey = "(YOUR API KEY)"
    statId = "0003033021" # 平成22年国税調査 速報集計

    statsDataUrl = "%s/getStatsData?appId=%s&statsDataId=%s"
    url = (statsDataUrl % (jsonUrl, apiKey, statId))
    print(url)
    f = urllib.request.urlopen(url)
    jsonData = json.loads(f.read())
    print (jsonData)

    file = open('StatsData.json', 'w')
    json.dump(jsonData, file, sort_keys=True, indent=4)
    file.close()

if __name__ == '__main__':
    sys.exit(getEStatData())

urlib.request.urlopenがbyte型を返すことに注意(参考; http://docs.python.jp/3/library/urllib.request.html)

TypeError: the JSON object must be str, not 'bytes'

下記のようにutf-8にデコードすると日本語のままデータが取得できますが、このようにデコードした場合でもERROR_MSG":"\u6B63\u5E38\u306B\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002"Unicodeエスケープされてしまう場合があったのですが、そんなときにはunicode-escapeを指定することで、回避していました。(正直、違いがわからない)。

    jsonData = json.loads(f.read().decode('utf-8'))
    print (jsonData)

一方で、出力したjsonファイルの方は、Unicodeエスケープされてしまいます。 これはjson.dumpsの引数であるensure_asciiがデフォルトでTrueになっており、入ってくるデータをエスケープする仕様になっていることに起因します。

従って、それをFalseにすることで、ファイルに書き出したときも日本語が保つことができます。

    file = open('StatsData.json', 'w')
    json.dump(jsonData, file, sort_keys=True, indent=4, ensure_ascii=False)
    file.close()

if __name__ == '__main__':
    sys.exit(getEStatData())