Pythonの辞書・文字列変換と、JSON処理。必須項目でしょっちゅう使うくせに覚えられない…
辞書 <–> 文字列変換基本
辞書から文字列に変換(dict -> string): json.dumps()
文字列から辞書に変換(string -> dict): json.loads()
json.loads()
とjson.load()
は似ているが違うもの。json.load()
はJSON形式のファイルを読み込むために使う。
JSON読み込み例
以下、CloudWatchアラームの閾値超え発生時イベントの中身をファイルに保存したのを呼び出している。json.load()
で呼び出した時点で、このオブジェクトは辞書型であり、それをjson.dumps()
で文字列に変換している。
>>> import json
>>> path = "event_sample.json"
>>> with open(path, encoding="utf-8", mode="r") as f:
... event = json.load(f)
... msg = json.dumps(event, indent=3)
... print(msg)
...
{
"version": "0",
"id": "86fa8a3f-7470-8c16-ef56-aaba9821771e",
"detail-type": "CloudWatch Alarm State Change",
"source": "aws.cloudwatch",
"account": "012345678910",
"time": "2022-02-03T10:17:51Z",
"region": "ap-northeast-1",
"resources": [
"arn:aws:cloudwatch:ap-northeast-1:012345678910:alarm:CPU_Utilization_Test"
],
"detail": {
"alarmName": "CPU_Utilization_Test",
"state": {
"value": "ALARM",
"reason": "Threshold Crossed: 1 out of the last 1 datapoints [100.0 (03/02/22 10:11:00)] was greater than the threshold (10.0) (minimum 1 datapoint for OK -> ALARM transition).",
"reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2022-02-03T10:17:51.018+0000\",\"startDate\":\"2022-02-03T10:11:00.000+0000\",\"statistic\":\"Maximum\",\"period\":60,\"recentDatapoints\":[100.0],\"threshold\":10.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2022-02-03T10:11:00.000+0000\",\"sampleCount\":5.0,\"value\":100.0}]}",
"timestamp": "2022-02-03T10:17:51.020+0000"
},
"previousState": {
"value": "INSUFFICIENT_DATA",
"reason": "Insufficient Data: 1 datapoint was unknown.",
"reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2022-02-03T10:13:51.019+0000\",\"statistic\":\"Maximum\",\"period\":60,\"recentDatapoints\":[],\"threshold\":10.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2022-02-03T10:13:00.000+0000\"}]}",
"timestamp": "2022-02-03T10:13:51.023+0000"
},
"configuration": {
"metrics": [
{
"id": "4cbe7286-d70f-fcb9-4a0a-758612d568db",
"metricStat": {
"metric": {
"namespace": "AWS/EC2",
"name": "CPUUtilization",
"dimensions": {
"InstanceId": "i-01234567891012345"
}
},
"period": 60,
"stat": "Maximum"
},
"returnData": true
}
]
}
}
}
イベントの中身を抽出するためにやってるんだけど、JSONの保存形式に不正があるとエラーになったりして面倒くさい。Lambdaにイベント渡している場合、LambdaのロググループをLogs Insightsでクエリかけると項目毎に見やすく整型されて画面表示してくれる。だからそっちで確認してもいいのだが…、やはりJSONデータとして見たい時もあるんだよな。