42271


python、jsonともにあまり使ったことがないので基本的な理解が抜けている可能性が高いのですが。。。

test.json

[code]

    {
        "book1":{
        "title":"Python Beginners",
        "year": 2005 ,
        "page": 399 
        }
    }
    
[/code]

test.py

[code]

    #!/usr/bin/python3
    import json
    f = open("test.json", 'r')
    json_data = json.load(f)
    json_str = str(json_data)
    jj = json.loads(json_str)
    print (jj)
    
[/code]

とやってるんですが、 json.loads のところで以下のエラーが出ます。  
なぜでしょうか？

[code]

    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
    
[/code]

ググりまくったのですがもう疲れました。


CC BY-SA 3.0
2018-03-09T08:39:53.420
42268
2018-03-09T09:37:24.417
2018-03-09T09:28:04.197
3054
27679
question
python json
str() で文字列にした Python のオブジェクトが json.loads で戻せない


端的に言うと、JSON文字列にしたい場合は `str` ではなく、`json.dumps` を使えばよいです。以下詳細。

### JSONのプロパティ名はダブルクォートで囲まれている必要がある

まず、JSONの表記はPythonのリテラルのような柔軟性はないので、Pythonのリテラルが（あるいはJavaScriptのリテラルであっても）必ずしもJSONとして有効ではないということに注意してください。

[code]

    >>> json.loads('{"a": 123}')   # これはOK
    {'a': 123}
    >>> json.loads("{'a': 123}")   # これはエラー
    # 略
    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
    
[/code]

上の例ではプロパティ名 `a` をシングルクォートで囲うとエラーになっています。

### `json.load` はPythonのオブジェクト（辞書）を返す

[`json.load`](https://docs.python.jp/3/library/json.html#json.load)の戻り値である
`json_data` はPythonのオブジェクト（辞書）です。

[code]

    >>> import json
    >>> f = open("test.json", 'r')
    >>> json_data = json.load(f)
    >>> type(json_data)
    <class 'dict'>
    >>> json_data
    {'book1': {'title': 'Python Beginners', 'year': 2005, 'page': 399}}
    
[/code]

### Pythonの辞書の `str` による文字列表現では、キー名がシングルクォートで囲われる

辞書である `json_data` を
[`str`](https://docs.python.jp/3/library/stdtypes.html#str)
に与えると、辞書の文字列表現が得られます。

[code]

    >>> str(json_data)
    "{'book1': {'title': 'Python Beginners', 'year': 2005, 'page': 399}}"
    
[/code]

この文字列はJSONとしては不正です。プロパティ名が `'book1'` のように、シングルクォートで囲まれているからです。  
ですから、これを `json.loads` に与えると、質問のようなエラーになります。

### PythonのオブジェクトをJSON文字列にするには `json.dumps` などを使う

上で見たように、`str` が返すのは必ずしもJSONとして有効な文字列ではありません。  
ですから、JSON文字列が必要な場合は[`json.dumps`](https://docs.python.jp/3/library/json.html#json.dumps)などを使用します。

[code]

    >>> json_str = json.dumps(json_data)
    >>> jj = json.loads(json_str)
    >>> print (jj)
    {'book1': {'title': 'Python Beginners', 'year': 2005, 'page': 399}}
    
[/code]


CC BY-SA 3.0
2018-03-09T09:22:09.017
42271
2018-03-09T09:22:09.017
3054
42268
answer

[code]

    # import json lib
    import json
    
    # load json
    data = json.load(open('data.json'))
    
    # print content
    print(data)
    
    # access a element
    print(data['book1'])
    
    # assess a element in a element
    print(data['book1']['title'])
    
    # looping over a list
    for x in data:
      print(data[x]['title'])
    
[/code]


CC BY-SA 3.0
2018-03-09T09:37:24.417
42272
2018-03-09T09:37:24.417
27681
42268
answer