質問への追記・修正 欄
Stringならシリアルに扱いたいので『\n 』で改行というのがわかる方がいいと思いますが
辞書型って階層も表現されたものが出力されると考えていました。
なので辞書型で『\n 』が変換されると思っています。
は名前"a"
に"b\nc"
という長さ3の文字列(1文字目が'b'、2文字目が改行文字、3文字目が'c')の値が紐付いたobject型のJSONです。
パースしたあとのPythonの用語だと「キー'a'
に値'b\nc'
が紐付いた辞書」ということになります。
python
1import json
2
3s = r'{"a": "b\nc"}'
4print(json.loads(s))
結果は
です。
これはあたりまえで、
などと出力されたらめちゃくちゃ困ります。
質問のデータも同じで\n
が入っているのは、JSONや辞書の構造の記述の部分ではなくて文字列の中なのです。
そこが勘違いしているポイントと推測します。
JSONの用語で言うと、object型の名前nameにarray型のデータが格納されていて、その最初の要素が文字列型で、その40番目の文字が改行です。
Pythonの用語で言うと、辞書型オブジェクトの'name'というキーにリスト型オブジェクトが紐付いていて、そのインデクス0番の要素が文字列型で、そのインデクス39番の部分文字列が改行です。
辞書内に含まれる文字列型なのですからそのままprintしたら\n
で表示されることに不思議はありません。
文字列そのものをprintする時とはふるまいが違います。
python
1s = r'{"sourcesContent":["existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}"]}'
2d = json.loads(s)
3print(d)
4print(type(d['sourcesContent'][0]))
5print(repr(d['sourcesContent'][0][39]))
6print()
7print(d['sourcesContent'][0])
結果
plain
1{'sourcesContent': ['existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}']}
2<class 'str'>
3'\n'
4
5existingLambdaObj: this.lambdaFunction,
6 dynamoTableProps: props.dynamoTableProps
7 });
8 this.dynamoTable = lambdaToDynamoDB.dynamoTable;
9 }
10}
\n
ではなく、
のように改行コードが入ると
Pythonとしてリテラルに解釈できない文法エラーを起こすコードであり、
JSONとして正しくないデータになってしまいます。
JSON仕様のstringのところを見てください。
except " or \ or control characters
制御コードを除くと書いてあります。ですから
python
1
2import json
3
4s = r'''{"a": "b
5c"}'''
6json.loads(s)
は正しくエラーになります。
plain
1json.decoder.JSONDecodeError: Invalid control character at: line 1 column 9 (char 8)