Python / Json:二重引用符で囲まれた予期されるプロパティ名


110

私は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形式ではないものでもあらゆる種類のデータを受け入れるため、個人的にはそれほど効率的ではないと思われるこのソリューション以外には何も機能しないようです。

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


18
私の間違いは二重引用符のことではありませんでした。Pythonのように、最後のキーと値のペアの後にコンマを追加していました。JSONではそれを行いません。
Luv33preet

4
json.dumps()単にpythonを作成するのではなく常に使用し、python表記がJavaScriptリーダーで機能することを期待してください。
vy32

aの結果を取得print(jsonpickle_deserialized_object_string)して使用しようとしたため、この問題が発生しました。なんらかの理由print()で見積もりが"から'
StingyJackに

@ Luv33preet、ありがとう、解決しました。しかし、logger-msgがmissing-commaか何かと期待していますが、このエラーはそれについて何も伝えていません
ganeshdeshmukh

迅速な修正については、stackoverflow.com / a / 63862387/1497139を参照してください
Wolfgang Fahl

回答:


150

この:

{'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です。

編集:
一部のコメンターは、上記では不十分であると提案しました。
JSON仕様-RFC7159では、文字列は引用符で開始および終了することが規定されています。それです"
単一クォート'は、JSONでは意味を持たず、文字列内でのみ許可されます。


4
ありがとう:)私はそれに注意を払いませんでした、私はデータを送信するときに正しいjsonフォーマットを使用していますが、それがバックエンドで受信されるとき、二重引用符は単一のものに置き換えられます!したがって、その例外が発生しました。
raeX 2016

25
これは解決策ではありません。解決策は、文字列を有効なjsonに変更する方法を彼に伝えます。
FistOfFury

2
@FistOfFury申し訳ありませんが、ステートメントは、任意の無効なJSON文字列をプログラムで有効なものに確実に変換できるという誤った仮定に基づいています。この質問に対する多くの答えは、 'を "に置き換えるなどして問題に取り組みます。これらの"解決策 "を壊す入力文字列の簡単な例を示す必要がありますか?どうやらOPが扱っているのは、 JSONおよび続行できました-私の回答を受け入れましたヒント-入力文字列はPython dict .__ repr __()メソッドの出力のように見えます
ElmoVanKielmo

4
@ElmoVanKielmoは、回答がステートメントであり、質問への回答ではないという事実を変更しません。コンテキストや説明はありません。質問についての情報を探してここに来る人々は失望するでしょう。あなたはOPを助けたかもしれませんが、他の人はそれほどではありません。
FistOfFury

単純な明確なステートメントは、多くの場合に役立ちます。特に、周りに他の答えがたくさんある場合。
ベン

47

JSONは二重引用符で囲んだ文字列のみを許可するため、次のように文字列を操作できます。

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

JSONがエスケープされた単一引用符(\')を保持している場合、より正確な次のコードを使用する必要があります。

import re
p = re.compile('(?<!\\\\)\'')
str = p.sub('\"', str)

これにより、JSON文字列内のすべての単一引用符が二重引用符にstr置き換えられます。後者の場合、エスケープされた単一引用符は置き換えられません。

js-beautifyそれほど厳密ではない方でも使用できます。

$ pip install jsbeautifier
$ js-beautify file.js

4
すべてのを "sが間違っている"に置き換えることができるため、良い考えではありません。例: 'it's bad'-> "it" s bad "-> malformed string
Reihan_amn

@Reihan_amnエスケープされた単一引用符が使用される場合のために、より正確な正規表現の代替を追加しました。
有効

正規表現で構文エラーが発生する
Wolfgang Fahl

@WolfgangFahl今すぐ再試行できます。
有効

thx 現在代わりにstackoverflow.com/a/63862387/1497139を使用しています
Wolfgang Fahl

33

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

最後のカンマは私に同じエラーメッセージを与えました。

{'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)

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


4
+1確認できます。末尾のコンマは、このエラーメッセージを生成します。例:を echo '{"json":"obj",}' | python -m json.tool シェルで実行すると、「期待されるプロパティ名は二重引用符で囲まれています:行1列15(文字14)」と表示されます。末尾のカンマは正当なJSONではありませんが、この場合はPython JSONモジュールが関連するエラーメッセージを出力した方がいいでしょう。
Laryx Decidua

7

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

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


6

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"
        }]
    }
}

2
そのリンクをありがとう!
WolVes

6

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

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

それがあなたにできることではないなら、あなたはast.literal_eval()代わりに使うことができますjson.loads()


3
これはPythonライブラリの制限ではなく、JSON形式自体の制限です。
Daniel Roseman 2016

あなたは正しいです。ただし、一部のJSONパーサーは二重引用符を強制しません。回答を更新します。
alexbclay 2016

このJSONではなく、単一引用符で囲まれた文字列内に二重引用符がない場合、呼び出す前にすべての単一を二重に文字列置換するだけですjson.loads()
nigel222

2
を使用ast.literal_evalするとValueError: malformed string、JSON文字列にブール値があるかどうかがわかります。
Scratch'N'Purr 2018年

4
import ast

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

json_data = ast.literal_eval(json.dumps(inpt))

print(json_data)

これで問題が解決します。


3

誤って述べているように、名前は一重引用符ではなく二重引用符で囲む必要があります。渡した文字列は有効なJSONではありません。それは次のようになります

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

2

私はこの方法を使用して、目的の出力を取得することができました。私のスクリプト

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

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

出力

>>> 0

2
with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

これは私にとっては完璧に機能しました。ありがとう。


2
x = x.replace("'", '"')
j = json.loads(x)

これは正しい解決策ですが、このようなJSONがあるとかなりの頭痛の種になる可能性があります-

{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}

その「真」の値に気づきましたか?これを使用して、ブール値の二重チェックを行います。これはそれらのケースをカバーします-

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)

また、作ってはいけません

x = json.loads(x)

別の変数でなければなりません。


1

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

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

 Expecting property name enclosed in double quotes

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


0

eval関数を使用します。

一重引用符と二重引用符の不一致を処理します。


ユーザー入力やHTTPリクエストで送信されるデータに対してevalを使用しないでください。これは大きなセキュリティ問題です。
ElmoVanKielmo

0

他の回答がよく説明しているように、jsonモジュールに渡された無効な引用文字が原因でエラーが発生します。

私の場合も、交換後とValueErrorを得るために続け'"、私の文字列に。最終的に気付いたのは、引用符のようなUnicodeシンボルが私の文字列に含まれていることです。

           `  ´     

これらすべてをクリーンアップするには、正規表現を介して文字列を渡すだけです。

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)

-1

JSONを手動で編集したときに、この問題に何度も遭遇しました。誰かが気づかずにファイルから何かを削除しようとした場合、同じエラーがスローされる可能性があります。

たとえば、JSONの最後の "}"がない場合、同じエラーがスローされます。

そのため、ファイルを手動で編集する場合は、JSONデコーダーで予期されるようにフォーマットしてください。そうしないと、同じ問題が発生します。

お役に立てれば!


-2

このjson.dumps()方法を使用することは常に理想的です。このエラーを取り除くために、私は次のコードを使用しました

json.dumps(YOUR_DICT_STRING).replace("'", '"')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.