質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

3回答

16335閲覧

Lambda + API Gateway でjsonを返そうとすると文字化けする。

Otazoman

総合スコア44

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/02/25 06:01

編集2018/02/25 06:07

AWSおよびPython初心者です。簡単なことなのかもしれませんがはまってしまって
困っています。ぜひお力をお貸しください。

サーバレスの勉強をしようとLambda+APIGateWayでサンプルを
作ろうとしています。Dynam-DBを使用せずLambdaでjsonを返すだけの
単純なものです。2つつまづいている点があります。対処方法をご教示
いただけますでしょうか。お願いいたします。

1.APIGateWay経由で返してきているjsonの日本語が取れない。
APIGateWayからブラウザで取得しようとする値が下図の様になっていて
日本語が正しく取得できません。
どの様にすれば数値列でない状態で日本語を取得できるでしょうか。

 イメージ説明

APIGateWayでテストした際には以下の様に日本語ベースで取れているように
見受けられます。APIGateWayのメソッドレスポンス等で文字コードを足したり
Python側でも色々してみましたが上図のままでした。

APIテスト結果
イメージ説明

Lambdaコードは以下の通りです。
```python

coding: utf-8

import json
from urllib.parse import parse_qs

def lambda_handler(event, context):
try:

params = parse_qs(event['body'].encode('utf-8'))

print (json.dumps(event,indent=2)) user_object = """{ { "id" : 12345, "name":"山下 清", "age" : 30, "url": "http://www.yahoo.co.jp/" }, { "id" : 22222, "name":"上田 尊司", "age" : 45, "url": "http://www.google.co.jp/" }, { "id" : 55555, "name":"清宮 仁郎", "age" : 28, "url": "http://www.yahoo.co.jp/" } }""" # return json return { 'statusCode' :200, 'headers' : {'content-type' : 'application/json'}, 'body': json.dumps(user_object,ensure_ascii=False) } except Exception as e: print(e) raise e
**2.json形式で取得した特定の値のキーが表示できない** 1のLambdaおよびAPIGateWayで返されてきたjsonをパースして idの値を取ろうとしているのですがエラーとなってしまい。 値が取れません。data[0].idの箇所です。どうやらNullの様です。 data自体はobjectとして認識されているようではありました。 ```JavaScript <script> function getJSON(){ var req = new XMLHttpRequest(); req.open('GET', "APIGAteWayのURI"); req.send(null); req.onreadystatechange = function() { if(req.readyState == 4 && req.status == 200){ var data = JSON.parse(req.responseText); alert(data[0].id); } } };

下記の記事を参考にしてみたのですが意図したとおりに動いてくれません。
https://qiita.com/1mada/items/9a48f7053a6016b5fd5a

色々と試行錯誤してみましたが調べ方もわからない状態です。
周りにAWSに精通している方もいらっしゃらないので申し訳ないですが
ご教示よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

すでにJSON文字列になっているもの(user_object)を、
さらにdumpsでJSONシリアライズしているからでは?
2の部分でオブジェクトとしてパースできないのは、二重にJSONシリアライズされているからだと考えられます。

掲載されているコード中で、
user_objectを文字列ではなくlistにして再度やってみてください。
その際、{}[]になおすのを忘れずに。

投稿2018/02/26 17:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otazoman

2018/02/27 02:30 編集

ひとまず下記のコードでNull値とならずundefindながら呼出せるレベルまでは 来ました。日本語がUTF-8のコードで表示される件は解決していませんが ご回答ありがとうございます。 user_object ={ 'statusCode' :200, 'headers' : {'content-type' : 'application/json'}, 'body':[ { 'id' : 12345, 'name':'山下 清', 'age' : 30, 'url': 'http://www.yahoo.co.jp/' }, { 'id' : 22222, 'name':'上田 尊司', 'age' : 45, 'url': 'http://www.google.co.jp/' }, { 'id' : 55555, 'name':'清宮 仁郎', 'age' : 28, 'url': 'http://www.yahoo.co.jp/' } ] } # return json return json.dumps(user_object,ensure_ascii=False)
guest

0

ひとまず解決しました。TKatayamaさんアドバイスありがとうございます。
json.dumpsせずにそのまま返してあげればidも取ることができました。
今後ともpython頑張らねば

import json # -*- coding:utf-8 -*- from urllib.parse import parse_qs def lambda_handler(event, context): try: user_object =[ { 'id' : 12345, 'name':'山下 清', 'age' : 30, 'url': 'http://www.yahoo.co.jp/' }, { 'id' : 22222, 'name':'上田 尊司', 'age' : 45, 'url': 'http://www.google.co.jp/' }, { 'id' : 55555, 'name':'清宮 仁郎', 'age' : 28, 'url': 'http://www.yahoo.co.jp/' } ] # return json return user_object   except Exception as e: print(e) raise e

投稿2018/02/27 05:11

Otazoman

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  1. 文字化けしてるように見えますが、それは文字化けではなく、ユニコード文字列が16進表示されているだけです。
  2. user_object = """{の部分はuser_object = """[の間違いではないですか?

投稿2018/02/26 00:40

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otazoman

2018/02/26 08:56 編集

早速のご回答ありがとうございます。 1.  ご指摘ありがとうございます。16進表示のままで戻ってきているので  何とか漢字表示でうまく取得できないかと考えている次第です。  ensure_ascii=False 上記をLambdaに追加してみたり、APIGateWayのレスポンス本文に  application/json;charset=UTF-8 を追加しましたが状況は変わりません。 2.  user_objectの箇所を訂正しましたが。結果はやはりNullのままの  様でした。jsonオブジェクトがうまくperseできていないようです。 たびたびすいませんがよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問