前提・実現したいこと
iOSアプリ(Swift)向けAPIをLambdaで作成しており、期待しているjsonができない。
期待しているjson
{ "statusCode": 200, "body": [{\"id\": 1, \"name\": \"sample1\", \"date\": \"2021-10-25T10:58:00\"},{\"id\": 2, \"name\": \"sample1\", \"date\": \"2021-10-25T10:58:00\"}] }
実際のjson
[]前後にダブルクォーテーションが入る。
{ "statusCode": 200, "body": "[{\"id\": 1, \"name\": \"sample1\", \"date\": \"2021-10-25T10:58:00\"},{\"id\": 2, \"name\": \"sample1\", \"date\": \"2021-10-25T10:58:00\"}]" }
該当のソースコード
python
1def lambda_handler(event, context): 2 with conn.cursor(pymysql.cursors.DictCursor) as cur: 3 cur.execute("select * from aaa") 4 data = cur.fetchall() 5 body = json.dumps(data, default=date_handler, ensure_ascii=False) 6 return { 7 'statusCode': 200, 8 'body': body 9 } 10def date_handler(obj): 11 return obj.isoformat() if hasattr(obj, 'isoformat') else obj
補足情報(FW/ツールのバージョンなど)
Swiftでは期待しているjsonのみしかdecodeできなかった。
struct res: Decodable { let statusCode: Int let body: [MemoModel] struct MemoModel: Decodable { var id: Int var name: String var date: Date } } func jsonDecode(data: Data) { let decoder: JSONDecoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted(.iso8601Shrt) let decodedRes = try! decoder.decode(res.self, from: data) print(decodedRes) } extension DateFormatter { static let iso8601Shrt: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" formatter.calendar = Calendar(identifier: .iso8601) formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() }
あなたの回答
tips
プレビュー