web-dev-qa-db-ja.com

Python / Json:二重引用符で囲まれたプロパティ名が必要です

私はPythonでJSONオブジェクトをロードする良い方法を見つけようとしてきました。このJSONデータを送信します。

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

それを文字列として受信するバックエンドに、json.loads(data)を使用して解析しました。

しかし、同じ例外が発生するたびに:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

私はそれをグーグルで検索しましたが、このソリューションjson.loads(json.dumps(data))以外は何も動作しないようです。これは、json形式ではないデータでもあらゆる種類のデータを受け入れるため、個人的にはそれほど効率的ではないようです。

どんな提案も大歓迎です。

50
raeX

この:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

jSONではありません。
この:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

jSONです。

91
ElmoVanKielmo

jSONでは二重引用符で文字列を囲むことしかできないため、次のように文字列を操作できます。

str = str.replace("\'", "\"")

これにより、JSON文字列str内のすべての単一引用符が二重引用符に置き換えられます。

厳密性の低いjs-beautifyを使用することもできます。

$ pip install jsbeautifier
$ js-beautify file.js
21
elig

JSON文字列には二重引用符を使用する必要があります。 JSON pythonライブラリはこれを強制するため、文字列をロードできません。データは次のようにする必要があります。

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

それができない場合は、ast.literal_eval()の代わりにjson.loads()を使用できます

6
alexbclay

簡単に言うと、その文字列は有効なJSONではありません。エラーが言うように、JSONドキュメントは二重引用符を使用する必要があります。

データのソースを修正する必要があります。

5
Daniel Roseman

このメソッドを使用して、目的の出力を得ることができました。私の脚本

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

出力

>>> 0
4
Hamed

JSONデータを確認しました

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

http://jsonlint.com/ で結果は:

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

次の文字列に変更すると、JSONエラーが解決します。

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}
4
Yaron

私の場合、二重引用符は問題ではありませんでした。

最後のコンマで同じエラーメッセージが表示されました。

{'a':{'b':c,}}
           ^

このコンマを削除するために、簡単なコードをいくつか書きました。

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

そして、これは私のために働いた。

3
greentec

エラーで明確に示されているように、名前は一重引用符ではなく二重引用符で囲む必要があります。渡す文字列は、有効なJSONではありません。次のようになります

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
2
Pavel Gurkov

同様の問題がありました。互いに通信する2つのコンポーネントはキューを使用していました。

最初のコンポーネントは、メッセージをキューに入れる前にjson.dumpsを実行していませんでした。そのため、受信コンポーネントによって生成されたJSON文字列は一重引用符で囲まれていました。これがエラーの原因でした

 Expecting property name enclosed in double quotes

Json.dumpsを追加すると、正しくフォーマットされたJSONの作成が開始され、問題が解決しました。

0
Rahul Bagal