私は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形式ではないデータでもあらゆる種類のデータを受け入れるため、個人的にはそれほど効率的ではないようです。
どんな提案も大歓迎です。
この:
{'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では二重引用符で文字列を囲むことしかできないため、次のように文字列を操作できます。
str = str.replace("\'", "\"")
これにより、JSON文字列str
内のすべての単一引用符が二重引用符に置き換えられます。
厳密性の低いjs-beautify
を使用することもできます。
$ pip install jsbeautifier
$ js-beautify file.js
JSON文字列には二重引用符を使用する必要があります。 JSON pythonライブラリはこれを強制するため、文字列をロードできません。データは次のようにする必要があります。
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
それができない場合は、ast.literal_eval()
の代わりにjson.loads()
を使用できます
簡単に言うと、その文字列は有効なJSONではありません。エラーが言うように、JSONドキュメントは二重引用符を使用する必要があります。
データのソースを修正する必要があります。
このメソッドを使用して、目的の出力を得ることができました。私の脚本
x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"
x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])
出力
>>> 0
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"
}]
}
}
私の場合、二重引用符は問題ではありませんでした。
最後のコンマで同じエラーメッセージが表示されました。
{'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)
そして、これは私のために働いた。
エラーで明確に示されているように、名前は一重引用符ではなく二重引用符で囲む必要があります。渡す文字列は、有効なJSONではありません。次のようになります
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
同様の問題がありました。互いに通信する2つのコンポーネントはキューを使用していました。
最初のコンポーネントは、メッセージをキューに入れる前にjson.dumpsを実行していませんでした。そのため、受信コンポーネントによって生成されたJSON文字列は一重引用符で囲まれていました。これがエラーの原因でした
Expecting property name enclosed in double quotes
Json.dumpsを追加すると、正しくフォーマットされたJSONの作成が開始され、問題が解決しました。